0

R 或 G 或 B 的值存储在 int 中,范围为 0~255。我已经有了图片每个像素的所有 rgb 值,我想根据我已经知道的 r,g,b 显示图片。

    BufferedImage imgnew = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
    for (int y = 0; y < height; y++) {
       for (int x = 0; x < width; x++) {
       //I can get access to the rgb of every pixel by R[x][y],G[x][y],B[x][y]
   //how to calculate the rgb of every pixel?   
       imgnew.setRGB(x, y, rgb);
       }
    }
    JFrame frame = new JFrame();
    JLabel labelnew = new JLabel(new ImageIcon(imgnew));
    frame.getContentPane().add(labelnew, BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);

我的问题是如何计算每个像素的正确像素,因为 rgb 存储为 int,我应该将其转换为字节吗?如果是,怎么做,如果不是,还有其他方法可以计算pix吗?我知道有人用

         int rgb = 0xff000000 | ((R[x][y] & 0xff) << 16) | (((G[x][y] & 0xff)<< 8) | ((B[x][y] & 0xff);//the way I calcualte the pix is wrong, which lead to the wrong color of pics

计算 rgb,但这里 R[x][y] G,B 存储在字节类型中

4

1 回答 1

1

该类BufferedReader按方法返回一个像素或像素列表getRGB(),我不得不提一下,您不会将它作为像 int[width][height] 这样的 2-demition 数组来获取,例如,如果您请求从 0,0 到 10 的像素,20,那么你会得到一个 200 长度的 int[] 数组。那么您需要将每个 int 值分解为 4 个字节,代表每个像素的 (argb),因此您可以使用ByteBuffer类来完成。

这里是一个简单的例子

int imgWidth=1920,imgHeight=1080;
int[] row=new int[imgWidth];//for storing a line of pixels
for(int i=0;i<imgHeight;i++){
  row=img.getRGB(0,i,imgWidth,1,null,0,imgWidth);//get pixel from the current row
  for(int k=0;k<row.length;k++){
    byte[] argb=ByteBuffer.allocate(4).putInt(4).array();//break up int(color) to 4 byte (argb)
    //doing some business with pixel....
  }
    //setting the processed pixel
    //////////////////////////////////////////UPDATED!
    //Preparing each pixel using ByteBuffer class, make an int(pixel) using a 4-lenght byte array
    int rgb=ByteBuffer.wrap(new byte[]{0xff,R[x][y]&0xff,G[x][y]&0xff,B[x][y]&0xff}).getInt();
    imgnew.setRGB(x,y,rgb);//this is bettrer to buffer some pixel then set it to the image, instead of set one-by-one
    //////////////////////////////////////////
    //img.setRGB(0,i,imgWidth,1,row,0,imgWidth)
}

也检查这个例子

于 2013-09-29T20:58:56.047 回答