我想从一个图像中读取单个像素,并将它们“重新定位”到另一个图像。我基本上想要模拟如果我从一个图像中逐个像素地抓取并将它们“移动”到空白画布上的情况。将我从原始图像抓取的像素变为白色。
这就是我现在所拥有的,我能够从图像中读取像素并创建一个副本(由于某种原因而出现饱和)。
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageTest
{
public static void main(String args[])throws IOException
{
//create buffered image object img
File oldImgFile = new File("/path/to/image/shrek4life.jpg");
BufferedImage oldImg = null;
BufferedImage newImg = null;
try{
oldImg = ImageIO.read(oldImgFile);
}catch(IOException e){}
newImg = new BufferedImage(oldImg.getWidth(), oldImg.getHeight(), BufferedImage.TYPE_INT_ARGB);
File f = null;
try
{
for(int i = 0; i < oldImg.getWidth(); i++){
for(int j = 0; j < oldImg.getHeight(); j++){
//get the rgb color of the old image and store it the new
Color c = new Color(oldImg.getRGB(i, j));
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
int col = (r<<16) | (g<<8) | b;
newImg.setRGB(i, j, col);
}
}
//write image
f = new File("newImg.jpg");
ImageIO.write(newImg, "jpg", f);
}catch(IOException e){
System.out.println("Error: " + e);
}
}//main() ends here
}//class ends here
我想基本上减慢过程并显示它发生。但我不知道该怎么做。我需要用来完成这个吗?我对线程有点新,但我想我需要多个线程来处理两张图片的绘画。
答案 0 :(得分:1)
首先,我想提一下你的工作效率很低。您正在创建一个Color,在其通道中分解像素,并通过位移移动到新图像。如果你整个时间直接使用整数(并且效率更高)会更容易。
我将假设图像&#34; /path/to/image/shrek4life.jpg"有ARGB色彩空间。我建议确保这一点,因为如果旧图像没有这个颜色空间,你应该conversion。
创建新图像时,将其创建为ARGB color space,因此每个通道都以int的字节表示,Alpha的第一个字节,红色的第二个字节,绿色的第三个字节和最后一个为了蓝色。
当您操纵旧图像像素将其移动到新图像时,我认为您忘记了Alpha通道。
考虑到这个解释,我认为您可以更改代码以提高效率,如下所示:
for(int i = 0; i < oldImg.getWidth(); i++){
for(int j = 0; j < oldImg.getHeight(); j++){
int pixel = oldImg.getRGB(i,j);
newImg.setRGB(i, j, pixel );
//If you like to get more control over the pixels and print
//you can decompose the pixel using Color as you already do
//But when you understand fully the process I recommend erase it
Color c = new Color(pixel);
//Print the color or do whatever you like
}
}
关于如何显示像素重定位的过程:
正在处理:
System.out.println("pixel"+pixel+" X:"+i+" Y:"+j);
update()
发布流程: