【问题标题】:Reading pixels from images using Java使用 Java 从图像中读取像素
【发布时间】:2011-08-02 07:43:19
【问题描述】:

我正在尝试从 RGB 转换为灰度图像。

执行此任务的方法如下:

public BufferedImage rgbToGrayscale(BufferedImage in)
{
    int width = in.getWidth();
    int height = in.getHeight();

    BufferedImage grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster raster = grayImage.getRaster();

    int [] rgbArray = new int[width * height];      
    in.getRGB(0, 0, width, height, rgbArray, 0, width);

    int [] outputArray = new int[width * height];
    int red, green, blue, gray;

    for(int i = 0; i < (height * width); i++)
    {
        red = (rgbArray[i] >> 16) & 0xff;
        green = (rgbArray[i] >> 8) & 0xff;
        blue = (rgbArray[i]) & 0xff;

        gray = (int)( (0.30 * red) + (0.59 * green) + (0.11 * blue));                        

        if(gray < 0)
            gray = 0;
        if(gray > 255)
            gray = 255;

        outputArray[i] = (gray & 0xff);           
        }
    }
    raster.setPixels(0, 0, width, height, outputArray);     

    return grayImage;       
}

我有一种将像素值保存在文件中的方法:

public void writeImageValueToFile(BufferedImage in, String fileName)
{
    int width = in.getWidth();
    int height = in.getHeight();

    try
    {
        FileWriter fstream = new FileWriter(fileName + ".txt");
        BufferedWriter out = new BufferedWriter(fstream);

        int [] grayArray = new int[width * height];     
        in.getRGB(0, 0, width, height, grayArray, 0, width);

        for(int i = 0; i < (height * width); i++)
        {                       
            out.write((grayArray[i] & 0xff) + "\n");                                
        }

        out.close();
    } catch (Exception e)
    {
        System.err.println("Error: " + e.getMessage());
    }
}

我遇到的问题是,我从我的方法中得到的 RGB 值总是比预期的大。

我创建了一个图像,并用颜色 128、128、128 填充它。根据第一种方法,如果我打印 outputArray 的数据,我得到:
r、g、b = 128、128、128。最终 = 127 ---> 正确:D

但是,当我调用第二种方法时,我得到的 RGB 值 187 不正确。

有什么建议吗?

谢谢!!!

【问题讨论】:

  • 为什么不创建另一个灰度的BufferedImage,将原始的绘制到其中,然后从graycale bufferedimage中获取像素值

标签: java image


【解决方案1】:

看看javax.swing.GrayFilter,它使用RBGImageFilter 类来完成同样的事情,并且实现非常相似。它可能会让你的生活更简单。

【讨论】:

    【解决方案2】:

    我不是这些方面的专家,但 RGB 值不是存储为十六进制(base16)吗?如果是这样,问题在于您假设操作&amp; 0xff 将导致您的int 被存储/处理为base16。这只是一个符号,字符串中的默认 int 用法始终为 base10。

        int a = 200;
        a = a & 0xff;
        System.out.println(a);
    
        // output
        200
    

    您需要使用显式 base16 toString() 方法。

        System.out.println(Integer.toHexString(200));
    
        // output
        c8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多