java - 如何使用java从像素值创建灰度图像

标签 java image bufferedimage grayscale

我的要求是,我需要将彩色图像转换为灰度图像并将灰度图像的像素值获取到数组并对该数组执行一些加密算法并再次使用这个更改后的像素数组,我需要转换返回/创建灰度图像并显示它。 这是我的疑惑。

  1. 使用彩色图像,我获得了三个不同数组中的 RGB 像素值。据我所知,可以通过 red+green+blue/3=gray 获得灰度像素。这里的红、蓝、绿、灰是二维数组。这种获取灰度像素值的方式是否正确?

    gray[x][y] = (r[x][y]+g[x][y]+b[x][y])/3;
    
  2. 如果这是正确的,那么我可以轻松地对该数组执行算法。真正的问题出现在这里。如何使用该像素阵列转换回/创建灰度图像。展示如何使用像素值创建灰度图像的示例将非常有帮助。谢谢。

    for(int x = 0;x<=height;x++) {
        for(int y = 0;y<=width;y++) {
            gray[x][y] = (r[x][y]+g[x][y]+b[x][y])/3;
            System.out.print(gray[x][y]+"\t");
        }
         System.out.println(" ");
    }
    

最佳答案

我建议创建一个新的 TYPE_BYTE_GRAY 的 BufferedImage,而不是通过自己操作像素将图像转换为灰度。然后就可以直接操作像素了。

public static BufferedImage convertToGray(BufferedImage biColor)
{
    BufferedImage biGray = new BufferedImage(biColor.getWidth(), biColor.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    biGray.getGraphics().drawImage(biColor, 0, 0, null);
    return biGray;
}

public static void manipulatePixels(BufferedImage biGray)
{
    byte [] imageData = ((DataBufferByte)biGray.getRaster().getDataBuffer()).getData();

    for (int i = 0; i < imageData.length; i++)
    {
        // do manipulation/encryption here - or on the entire array at once
    }
}

如果出于某种原因你想从字节数组创建一个全新的图像,只需创建一个新图像并将像素复制到它的字节数组中。

public static BufferedImage createImageFromArray(byte[] imageData, int width, int height)
{
    BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
    byte [] newData = ((DataBufferByte) newImage.getRaster().getDataBuffer()).getData();

    for (int i = 0; i < imageData.length; i++)
    {
        newData[i] = imageData[i];
    }
    return newImage;
}

关于java - 如何使用java从像素值创建灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29281358/

相关文章:

javascript - 使用 Javascript 显示和隐藏带有下一个上一个按钮的图像

java - 使用 TYPE_USHORT_GRAY 在java中读取黑白图像

java - 如何在java中打开和替换apache PDFBox lib中PDF流中的数据?

java - 将命令行中的文本获取到 Java 中

java - 事务的传播行为

java - 轻松创建 "loading"动画

java - 将数据从 Activity 传递到同一 Activity 中在 webView 加载的 HTML 文件中使用的 JavaScript

ajax - 转换图像数据以在浏览器中呈现图像

java - 在另一个图像上绘制缓冲图像?

java - 如何绘制带有色调的 BufferedImage