1

我需要为 Java 中的图像处理创建一个简单的演示。我的代码是基于摇摆的。我不必做任何复杂的事情,只需表明图像以某种方式发生了变化。我将图像读取为byte[]. 无论如何,我可以在不破坏字节的情况下操作这个字节数组来显示一些非常简单的操作。我不想使用paint()等。我可以直接对byte[]数组做些什么来显示一些变化吗?

编辑:
我正在使用 apache io 库将 jpg 图像作为 byteArrayInputStream 读取。字节读取正常,我可以通过将它们写回 jpeg 来确认它。

4

1 回答 1

2

您可以尝试将 RGB 图像转换为灰度。如果图像以每像素 3 个字节表示为 RedGreenBlue,则可以使用以下公式:y=0.299*r+0.587*g+0.114*b。

要清楚地遍历字节数组并替换颜色。这里有一个例子:

    byte[] newImage = new byte[rgbImage.length];

    for (int i = 0; i < rgbImage.length; i += 3) {
        newImage[i] = (byte) (rgbImage[i] * 0.299 + rgbImage[i + 1] * 0.587
                + rgbImage[i + 2] * 0.114);
        newImage[i+1] = newImage[i];
        newImage[i+2] = newImage[i];
    }

更新:

上面的代码假设您使用的是原始 RGB 图像,如果您需要处理 Jpeg 文件,您可以这样做:

        try {
            BufferedImage inputImage = ImageIO.read(new File("input.jpg"));

            BufferedImage outputImage = new BufferedImage(
                    inputImage.getWidth(), inputImage.getHeight(),
                    BufferedImage.TYPE_INT_RGB);
            for (int x = 0; x < inputImage.getWidth(); x++) {
                for (int y = 0; y < inputImage.getHeight(); y++) {
                    int rgb = inputImage.getRGB(x, y);
                    int blue = 0x0000ff & rgb;
                    int green = 0x0000ff & (rgb >> 8);
                    int red = 0x0000ff & (rgb >> 16);
                    int lum = (int) (red * 0.299 + green * 0.587 + blue * 0.114);
                    outputImage
                            .setRGB(x, y, lum | (lum << 8) | (lum << 16));
                }
            }
            ImageIO.write(outputImage, "jpg", new File("output.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
于 2013-04-15T12:55:39.557 回答