java中图片与像素矩阵转换,java - Java中具有矩阵乘法的图片转换不起作用 - 堆栈内存溢出...
我正在用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中具有矩阵乘法的图片转换不起作用 - 堆栈内存溢出...相关推荐
- java replace第二个_java - 错误的第二个参数类型:从片段内调用.replace() - 堆栈内存溢出...
我知道这个问题经常被问到,但是没有一个被接受的解决方案对我有用. 尝试从其他片段之一启动"首选项菜单"片段时,出现经典的"错误的第二个参数类型"错误. 不幸的是 ...
- android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...
- java导出表格vsd_java - 如何使用Apache POI将vsd / vsdx文件转换为图像(例如jpg png) - 堆栈内存溢出...
我正在使用apache poi读取doc / docx文件. 现在,我可以从文档文件中提取段落和图片. 当我的doc文件中有vsd时,如何将vsd转换为png图像? 我尝试了这个: private b ...
- java算球体积的代码_java - 球体体积法不起作用 - 堆栈内存溢出
为了使球体体积法起作用,我尝试了许多不同的计算方法. 我的Sphere类是从Circle扩展的,以从圆中获取面积,并实现了Shape3D接口,该接口允许我使用体积方法. 但是,我已经为我的方法尝试了所 ...
- android 按钮 叠加,android - 叠加层按钮在Android 4.3中不起作用 - 堆栈内存溢出
我在WindowManager.LayoutParams.TYPE_TOAST级别层上有一个带按钮的覆盖视图. 该按钮在Android 4.2中可以正常工作,但是当我在Android 4.3中运行相同 ...
- Linux中httpd353错误,linux - 由于控制进程退出并显示错误代码,因此httpd.service的作业失败 - 堆栈内存溢出...
更改00-nova-placement-api.conf ,我正在虚拟机中研究00-nova-placement-api.conf , 我想重启httpd : systemctl restart ht ...
- matlab输出pdf图片超出边框,matlab - 将Matlab Simulink模型保存为PDF,带有紧密的边界框 - 堆栈内存溢出...
给定Simulink框图(模型),我想生成稍后在LaTeX文档中使用的"屏幕截图". 我希望这个截图是PDF(矢量图形, - > pdflatex),带有一个紧密的边界框,我 ...
- java soap附件_java - 附件在SoapUI中工作,但在Java中不能使用SAAJ API吗? - 堆栈内存溢出...
我能够使用SoapUI附加一个完全相同的SOAP Request的zip文件,但不能使用SAAJ Api的Java. 这是我在SOAPUI和JAVA中使用的SOAP请求: projectName ci ...
- linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py']中,并且我的Java应用程序与此Py ...
最新文章
- 【深度学习】模型训练教程之Focal Loss调参和Dice实现
- Angular2中的路由(简单总结)
- oracle 事务未正常回滚,Spring事务没有回滚异常(Oracle JNDI数据源)
- python三方库打包项目中_将Python库打包到项目中
- .NET Core WebAPI Swagger使用
- SQL 数据库的自动备份(Procedures实现)
- 反转 鼠标_新版 Win10 中改变鼠标颜色
- Linux系统管理(11)——linux下jdk的安装及环境变量配置
- 胡伟武计算机体系结构2版pdf_最新重大版重庆高中英语必修模块1/2/3/4课文听力单词录音MP3音频+电子课本PDF+课件+教案+试题...
- uva1382 Distant Galaxy
- 书单丨上过太空的JavaScript用着就是香!
- Android Framework - 学习启动篇
- 浅析EL表达式注入漏洞
- android模拟器开启vt,逍遥安卓模拟器怎样打开VT模式 VT虚拟化设置办法
- 计算机组装与维护考试题a卷,计算机组装与维护考试题A卷.docx
- 删除Windows11中设备与驱动器下的多余图标
- 关于wordcloud安装
- Module ‘“../node_modules/@types/react-router“‘ has no exported member ‘withRouter‘.
- 本地 paraview 查看节点数据
- linux运行php文件
热门文章
- 利用python进行tf-idf算法绘制词云图_利用python实现通过TF-IDF和BM25提取文章关键词...
- html语言使用什么来定位,HTML是什么,URL是什么
- mermaid流程图工具_Markdown高级使用之流程图
- QT每日一练day26:绘制图片
- takephoto 框架_GitHub - Smecking/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库...
- 大学计算机基础课学几年,大学计算机基础类课程教学(2017年开始)-杭州师范大学计算机教育与.PDF...
- miniui 样式第一次加载不出来_matplotlib--修改样式
- c语言面试会问10个数排序吗,c语言面试最必考的十道试题,求职必看!!!
- react组件卸载调用的方法_React调用子组件方法与命令式编程误区
- 西门子s7 计算机通讯,西门子s7-200 plc通讯连不上怎么办?