我正在用Java实现图片转换。 到目前为止,我已经实现了以下类:

矩阵 (持有一个3x3矩阵,该矩阵将用于与Vector相乘)

向量 (用于与变换矩阵相乘以生成原始图像像素的新位置)

PictureTransformer (转换Image并将新值存储到临时数组)

图片 (保存Image mImage和pixel数组mPixels的成员变量,并提供getter和setter方法)

Window (用于测试功能的临时类,因为这些类将是较大程序的一部分)

在测试程序时,我注意到一些奇怪的行为:

无论我使用哪种转换,图片始终在缩放

无论我多久触发一次MouseEvent,转换都只会执行一次

我已经修复了public static Vector multiply(Matrix a, Vector v);算法中的一些错误public static Vector multiply(Matrix a, Vector v); 因此乘法应能按预期工作。

在解决了这些问题几个小时之后,我对如何解决这个问题一无所知。 任何帮助将非常感激!

我希望可以发布整个代码,因为我不确定,哪些部分将有助于解决错误。

这些是类:

窗口:

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.FileDialog;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.MediaTracker;

import java.awt.event.ActionEvent;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.image.MemoryImageSource;

import java.awt.image.PixelGrabber;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class Window extends JFrame {

Matrix m;

Window(int x, int y){

setBounds(20, 20, x, y);

final JPanel p = new JPanel();

p.setLayout(new BorderLayout());

Image img;

int[] pix;

MemoryImageSource m_ImgSrc;

FileDialog diag = new FileDialog(this);

diag.setVisible(true);

img = getToolkit().getImage(diag.getDirectory()+diag.getFile());

// getScaledInstance(x,y, Image.SCALE_SMOOTH);

diag.setFile("");

MediaTracker mt = new MediaTracker(this);

mt.addImage(img,0);

try {

mt.waitForAll();

} catch (InterruptedException e) {

e.printStackTrace();

}

Picture bild = new Picture(img);

PictureTransformer g = new PictureTransformer(bild);

p.add(g);

add(p, BorderLayout.CENTER);

g.repaint();

setVisible(true);

p.addMouseListener(new MouseListener(){

public void mouseClicked(MouseEvent arg0) {

System.out.println("Mouse-Event");

m = Matrix.rotate(45.0); //perform rotation by 45°

// System.out.println(m.v[0][0]);

g.transform(m);

p.repaint();

}

});

}

public static void main(String[] args) {

new Window(640, 480);

}

}

PictureTransformer:

import java.awt.Graphics;

import javax.swing.JComponent;

public class PictureTransformer extends JComponent{

Picture p;

PictureTransformer(Picture p){

this.p = p;

}

@Override

public void paintComponent(Graphics g){

g.drawImage(p.getImage(), 0, 0, 640, 480, this);

}

public void transform(Matrix t){ //p.W/p.H = Dimensions of the current picture to transform

int[] mPixelsResult = new int[p.getPixels().length]; //The temporary array contains the transformed pixels.

for(int x = 0; x < p.W; ++x){

for(int y = 0; y < p.H; ++y){

Vector v = Matrix.multiply(t, new Vector(x, y)); //Generates a Vector with new x- and y- values.

if(v.getVectorX() >= 0 && v.getVectorY() >= 0 && v.getVectorX() < p.W && v.getVectorY() < p.H){

mPixelsResult[p.W* y + x] = p.getPixels()[p.W * v.getVectorY() + v.getVectorX()]; //Stores the pixels at their new location.

}else{

mPixelsResult[p.W * y + x] = 0xFF000000; //Paint the background black, if not covered by the transformed picture.

}

}

}

p.setPixels(mPixelsResult); //Overwrite the original pixel-array with the temporary values.

p.mImage = createImage(p.mImgSrc);

p.mImage.flush();

repaint();

}

}

图片:

import java.awt.*;

import java.awt.image.*;

public class Picture {

int[] mPixels;

MemoryImageSource mImgSrc;

Image mImage;

final int W = 640; final int H = 480;

public Picture(Image img)

{

mImage = img;

mPixels = new int[W*H];

PixelGrabber pg = new PixelGrabber(mImage ,0,0,W,H,mPixels,0,W);

try {

pg.grabPixels();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println(mPixels);

mImgSrc = new MemoryImageSource(W,H,mPixels,0,W);

}

public int[] getPixels()

{

return this.mPixels;

}

public Image getImage()

{

return this.mImage;

}

public void setPixels(int[] newPix)

{

this.mPixels = newPix;

}

public void setImage(Image newImg)

{

this.mImage = newImg;

}

}

矩阵

public class Matrix {

double[][] v;

Matrix(double[][] v){

this.v = v;

}

/** Creates an Matrix that will used to translate the picture to the coordinates

* clicked on the screen.

**/

public static Matrix translate(int dx, int dy){

double dM[][] = {{1, 0, 0}, {0, 1, 0}, {Math.round(-dx), Math.round(-dy), 1}};

return new Matrix(dM);

}

public static Matrix rotate(double a){

double rad = -(Math.PI * a / 180);

double dM[][] = {{Math.cos(rad), Math.sin(rad), 0},{Math.sin(rad), Math.cos(rad), 0}, {0, 0, 1}};

return new Matrix(dM);

}

/** Creates an Matrix that will used to scale the picture by the given factor. **/

public static Matrix scale(double f){

double dM[][] = {{1/f, 0, 0}, {0, 1/f, 0}, {0, 0, 1}};

return new Matrix(dM);

}

public static Matrix shearX(double sX){

double dM[][] = {{1, 0, 0}, {-sX, 1, 0}, {0, 0, 1}};

return new Matrix(dM);

}

public static Matrix shearY(double sY){

double dM[][] = {{1, -sY, 0}, {0, 1, 0}, {0, 0, 1}};

return new Matrix(dM);

}

public static Matrix multiply(Matrix x, Matrix y){

double[][] p = new double[3][3];

for(int i = 0; i < x.v.length; ++i){

for(int j = 0; j < x.v[i].length; j++){

for(int k = 0; k < 3; k++){

p[i][j] += + x.v[k][j] * y.v[i][k];

}

}

}

return new Matrix(p);

}

public static Vector multiply(Matrix a, Vector v){

int[] res = new int[a.v[0].length];

for(int i = 0; i < a.v[0].length; i++){

for(int j = 0; j < a.v.length; j++){

/* Multiplying the Vector with the Matrix.

* (x) [a d g] (a) (d) (g)

* (y) * [b e h] = x * (b) + y * (e) + z * (h)

* (z) [c f i] (c) (f) (i)

* (x*a + y*d + z*g)

* = (x*b + y*e + z*h)

* (x*c + y*f + z*i)

*/

res[i] += a.v[i][j] * v.getVector(j);

}

}

Vector r = new Vector(res[0], res[1]); //Copying the result which represents the new pixel location into an Vector

return r;

}

}

向量

public class Vector {

private int[] v;

Vector(int x, int y){

v = new int[3]; //We'll always have a 3 Vector...

v[0] = x;

v[1] = y;

v[2] = 1;

// System.out.println("NEW VECTOR " + v[0] + " "+ v[1]);

}

Vector(){

v = new int[3];

v[0] = 0;

v[1] = 0;

v[2] = 1;

}

public int getVectorX(){

return v[0];

}

public int getVectorY(){

return v[1];

}

public int getVectorZ(){

return v[2];

}

public void setVector(int i, double d){

v[i] = (int)d;

}

public int getVector(int i){

return v[i];

}

public void setVectorX(int i){

v[0] = i;

}

public void setVectorY(int i){

v[1] = i;

}

}

java中图片与像素矩阵转换,java - Java中具有矩阵乘法的图片转换不起作用 - 堆栈内存溢出...相关推荐

  1. java replace第二个_java - 错误的第二个参数类型:从片段内调用.replace() - 堆栈内存溢出...

    我知道这个问题经常被问到,但是没有一个被接受的解决方案对我有用. 尝试从其他片段之一启动"首选项菜单"片段时,出现经典的"错误的第二个参数类型"错误. 不幸的是 ...

  2. android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...

    我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...

  3. java导出表格vsd_java - 如何使用Apache POI将vsd / vsdx文件转换为图像(例如jpg png) - 堆栈内存溢出...

    我正在使用apache poi读取doc / docx文件. 现在,我可以从文档文件中提取段落和图片. 当我的doc文件中有vsd时,如何将vsd转换为png图像? 我尝试了这个: private b ...

  4. java算球体积的代码_java - 球体体积法不起作用 - 堆栈内存溢出

    为了使球体体积法起作用,我尝试了许多不同的计算方法. 我的Sphere类是从Circle扩展的,以从圆中获取面积,并实现了Shape3D接口,该接口允许我使用体积方法. 但是,我已经为我的方法尝试了所 ...

  5. android 按钮 叠加,android - 叠加层按钮在Android 4.3中不起作用 - 堆栈内存溢出

    我在WindowManager.LayoutParams.TYPE_TOAST级别层上有一个带按钮的覆盖视图. 该按钮在Android 4.2中可以正常工作,但是当我在Android 4.3中运行相同 ...

  6. Linux中httpd353错误,linux - 由于控制进程退出并显示错误代码,因此httpd.service的作业失败 - 堆栈内存溢出...

    更改00-nova-placement-api.conf ,我正在虚拟机中研究00-nova-placement-api.conf , 我想重启httpd : systemctl restart ht ...

  7. matlab输出pdf图片超出边框,matlab - 将Matlab Simulink模型保存为PDF,带有紧密的边界框 - 堆栈内存溢出...

    给定Simulink框图(模型),我想生成稍后在LaTeX文档中使用的"屏幕截图". 我希望这个截图是PDF(矢量图形, - > pdflatex),带有一个紧密的边界框,我 ...

  8. java soap附件_java - 附件在SoapUI中工作,但在Java中不能使用SAAJ API吗? - 堆栈内存溢出...

    我能够使用SoapUI附加一个完全相同的SOAP Request的zip文件,但不能使用SAAJ Api的Java. 这是我在SOAPUI和JAVA中使用的SOAP请求: projectName ci ...

  9. linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...

    我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py​​']中,并且我的Java应用程序与此Py ...

最新文章

  1. 【深度学习】模型训练教程之Focal Loss调参和Dice实现
  2. Angular2中的路由(简单总结)
  3. oracle 事务未正常回滚,Spring事务没有回滚异常(Oracle JNDI数据源)
  4. python三方库打包项目中_将Python库打包到项目中
  5. .NET Core WebAPI Swagger使用
  6. SQL 数据库的自动备份(Procedures实现)
  7. 反转 鼠标_新版 Win10 中改变鼠标颜色
  8. Linux系统管理(11)——linux下jdk的安装及环境变量配置
  9. 胡伟武计算机体系结构2版pdf_最新重大版重庆高中英语必修模块1/2/3/4课文听力单词录音MP3音频+电子课本PDF+课件+教案+试题...
  10. uva1382 Distant Galaxy
  11. 书单丨上过太空的JavaScript用着就是香!
  12. Android Framework - 学习启动篇
  13. 浅析EL表达式注入漏洞
  14. android模拟器开启vt,逍遥安卓模拟器怎样打开VT模式 VT虚拟化设置办法
  15. 计算机组装与维护考试题a卷,计算机组装与维护考试题A卷.docx
  16. 删除Windows11中设备与驱动器下的多余图标
  17. 关于wordcloud安装
  18. Module ‘“../node_modules/@types/react-router“‘ has no exported member ‘withRouter‘.
  19. 本地 paraview 查看节点数据
  20. linux运行php文件

热门文章

  1. 利用python进行tf-idf算法绘制词云图_利用python实现通过TF-IDF和BM25提取文章关键词...
  2. html语言使用什么来定位,HTML是什么,URL是什么
  3. mermaid流程图工具_Markdown高级使用之流程图
  4. QT每日一练day26:绘制图片
  5. takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...
  6. 大学计算机基础课学几年,大学计算机基础类课程教学(2017年开始)-杭州师范大学计算机教育与.PDF...
  7. miniui 样式第一次加载不出来_matplotlib--修改样式
  8. c语言面试会问10个数排序吗,c语言面试最必考的十道试题,求职必看!!!
  9. react组件卸载调用的方法_React调用子组件方法与命令式编程误区
  10. 西门子s7 计算机通讯,西门子s7-200 plc通讯连不上怎么办?