java - 读入 Bufferedimage 像素值,然后操作每个像素值并写入文件

标签 java rgb bufferedimage pixel bitmapimage

我目前正在尝试逐像素读取图像并将每个彩色像素更改为 RGB 值 (100,100,100)。无论出于何种原因,当我检查保存图像的每个像素的值时,它的所有彩色像素都为 (46,46,46)。

这是原图

enter image description here

运行我的程序后,这是它给我的图像

enter image description here

这是代码

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

public class Cmaps {
    public static void main(String[] args){
        File originalImage = new File("C:\\Users\\Me\\Desktop\\0005.bmp");
        BufferedImage img = null;
        try{
            img = ImageIO.read(originalImage);
            for(int i = 0; i < img.getHeight(); i++){
                for(int j = 0; j < img.getWidth(); j++){
                    //get the rgb color of the image and store it
                    Color c = new Color(img.getRGB(i, j));
                    int r = c.getRed();
                    int g = c.getGreen();
                    int b = c.getBlue();
                    //if the pixel is white then leave it alone
                    if((r == 255) && (g == 255) && (b == 255)){
                        img.setRGB(i, j, c.getRGB());
                        continue;
                    }
                    //set the colored pixel to 100,100,100
                    r = 100;// red component 0...255
                    g = 100;// green component 0...255
                    b = 100;// blue component 0...255
                    int col = (r << 16) | (g << 8) | b;
                    img.setRGB(i, j, col);
                }
            }
            File f = new File("C:\\Users\\Me\\Desktop\\2\\1.png");
            try {
                ImageIO.write(img, "PNG", f);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

我不知道为什么它不将像素设置为预期的 RGB 值。我最终希望能够在 x 和 y 中向下移动行和列时基本上增加 rgb 颜色,因此最终图像将在左上角开始变暗,然后具有淡出效果当你从那一侧到达右下角时。

最佳答案

好的,根据评论:

如果BufferedImage有一个IndexColorModel(基于调色板的颜色模型),使用setRGB将像素设置为任意RGB值将不会工作。相反,将查找颜色,并且像素将获得调色板中被认为最接近的匹配颜色。

使用 ImageIO 读取时,BMP、GIF 和 PNG 等格式都可能使用 IndexColorModel

要将图像转换为“真彩色”(Java 中的 DirectColorModelComponentColorModel 都可以),您可以使用:

BufferedImage img; // your original palette image

int w = img.getWidth();
int h = img.getHeight();
BufferedImage trueColor = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

Graphics2D g = trueColor.createGraphics();
try {
    g.drawImage(img, 0, 0, null);
}
finally {
    g.dispose();
}

img = trueColor;

此后,getRGB(x, y) 应该使用 setRGB(x, y, argb) 返回您指定的内容。

关于java - 读入 Bufferedimage 像素值,然后操作每个像素值并写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875461/

相关文章:

java - 强制 paintAll() 绘制不可见的 JPanel 及其组件?

java - 如何加密 BufferedImage 使其只能由程序读取?

java动画声音无法正常播放

java - YUV TO RGB 结果转负值

java - 线程转储分析(AWT-EventQueue 可运行但等待条件)

php - RGB 到 HSL 函数中的饱和度计算不正确

java - 鼠标光标下的 RGB 值

java - 获取 BufferedImage 作为资源,以便它可以在 JAR 文件中工作

java - 奇怪的 Java 替换优先

java - 具有延迟可观察性的 SwitchMap