像素重定位,并排显示

时间:2017-12-01 22:29:48

标签: java image bufferedimage

我想从一个图像中读取单个像素,并将它们“重新定位”到另一个图像。我基本上想要模拟如果我从一个图像中逐个像素地抓取并将它们“移动”到空白画布上的情况。将我从原始图像抓取的像素变为白色。

这就是我现在所拥有的,我能够从图像中读取像素并创建一个副本(由于某种原因而出现饱和)。

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

我想基本上减慢过程并显示它发生。但我不知道该怎么做。我需要用来完成这个吗?我对线程有点新,但我想我需要多个线程来处理两张图片的绘画。

1 个答案:

答案 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
  }
}

关于如何显示像素重定位的过程:

正在处理

  1. 您可以将更改的像素作为数字打印,并将其位置保留在图像中(不鼓励)。 System.out.println("pixel"+pixel+" X:"+i+" Y:"+j);
  2. 在baeldung中使用此tutorial打印图像。我建议draw a rectangle使用图像的颜色并等待按键(例如,使用Scanner输入)。按下键后,您可以加载下一个像素,依此类推。
  3. 如果只有一个像素的单个矩形信息很少,我建议添加一个矩形数组来一次绘制几个像素。即使您可以打印图像,并逐个像素地查看该过程,使用扫描仪标记每个步骤。
  4. 正如@haraldK建议的那样,您可以使用Swing来显示de重定位图像。通过摇摆计时器并调用update()
  5. 发布流程

    1. 将图像保存在文件中。为了提高处理速度,我建议保存几个像素(10 - 100)。