如何在java中读取图像并将其转换为字节数组?[以Lena.bmp 512x512为例]

时间:2014-11-13 07:52:03

标签: java image pixel

我想分析lena.bmp(matlab)的像素 但我不知道如何在java中执行此操作并将其存储到byte []

我已经阅读了这篇文章:

how to convert image to byte array in java?

但是当我实施时,我发现了一些 pixel value that did't exist。 例如,像素范围是0~255, 但我找不到' 120'在这张照片的像素(lena.bmp)。

有我的代码

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Image_IO;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author user
 */
public class ReadImage {
    public static void main (String []args){
        byte[] imageInByte;
        int [] kindOfPixel = new int [256];
        try{
            BufferedImage originalImage = ImageIO.read(new File("C:\\Users\\user\\Desktop\\Project\\LSB_implement\\Lena.bmp"));
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write( originalImage, "bmp", baos );
            baos.flush();
            imageInByte = baos.toByteArray();
            System.out.println(imageInByte.length);
            baos.close();

            for(int i=0;i<imageInByte.length;i++){
                kindOfPixel[imageInByte[i]+128]++;  //java byte defined -128~127  (+128)==> 0~256
            }

            for(int i=0;i<kindOfPixel.length;i++){  //show the pixel color value
                System.out.println(i+" , "+kindOfPixel[i]);
            }

        }catch(IOException e){
            System.out.println(e.getMessage());
        }


   }    
}

我将这些信息与lena.bmp的直方图进行比较, 但似乎有些不同......

1 个答案:

答案 0 :(得分:1)

首先在java字节上

您知道签名的java字节范围为-128到127。 您错误地使用128而不是计算模256:

这简直归结为:

            kindOfPixel[imageInByte[i] & 0xFF]++;

寻找:

  • 无符号字节120:&lt; 127因此 120
  • 无符号字节130:&gt; = 127因此130 - 256 = -126

另一个方向的模256计算:

byte signed = -126;
int unsigned = signed < 0 ? signed + 256 : signed;
int unsigned = signed & 0xFF; // or simply this

像素

BMP文件不是(仅)线性化像素列表。所以最好使用int[] BufferedInage.getRGB

int[] pixels = originalImage.getRGB(0, 0, width, height, null, 0, width);

仍为颜色代表

BMP知道许多变体:RGB,索引等。索引颜色需要在调色板中查找。