在java中更改图像颜色

在java中更改图像颜色,java,image,Java,Image,我试图改变图像的颜色。因此,我使用了以下代码 public class Picture { String img_name; BufferedImage buf_img; int width; int height; public Picture(String name) { this.img_name = name; try { buf_img = ImageIO.read(new File(img_name)); } catch (IOExcep

我试图改变图像的颜色。因此,我使用了以下代码

public class Picture {

String img_name;
BufferedImage buf_img;
int width;
int height;

public Picture(String name) {
    this.img_name = name;

    try {
        buf_img = ImageIO.read(new File(img_name));
    } catch (IOException ex) {
        Logger.getLogger(Picture.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public Picture(int w, int h) {
    this.width = w;
    this.height = h;
    buf_img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
}

public int width() {
    width = buf_img.getWidth();
    return width;
}

public int height() {
    height = buf_img.getHeight();
    return height;
}

public Color get(int col, int row) {
    Color color = new Color(buf_img.getRGB(col, row));
    return color;
}

public void set(int col, int row, Color color) {
    buf_img.setRGB(col, row, color.getRGB());
}

public void show() {
    try {

        File saveAs = new File("D:\\temp\\" + new Random().nextInt() + ".png");
        ImageIO.write(buf_img, "png", saveAs);

        Desktop.getDesktop().open(saveAs);
    } catch (IOException ex) {
        Logger.getLogger(Picture.class.getName()).log(Level.SEVERE, null, ex);
    }
   }

 }

public class ColorSeparation {

public static void main(String[] args) {

    // read in the picture specified by command-line argument
    Picture picture = new Picture("D:\\qwe1.jpg");
    int width = picture.width();
    int height = picture.height();

    // create three empy pictures of the same dimension
    Picture pictureR = new Picture(width, height);


    // separate colors
    for (int col = 0; col < width; col++) {
        for (int row = 0; row < height; row++) {
            Color color = picture.get(col, row);
            int r = color.getRed();
            int g = color.getGreen();
            int b = color.getBlue();
            pictureR.set(col, row, new Color(r, 0, 0));

        }
    }

    // display  picture in its own window
    pictureR.show();

  }

}
公共类图片{
字符串img_名称;
BufferedImage buf_img;
整数宽度;
内部高度;
公共图片(字符串名称){
this.img_name=名称;
试一试{
buf_img=ImageIO.read(新文件(img_名称));
}捕获(IOEX异常){
Logger.getLogger(Picture.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共图片(int w,int h){
这个宽度=w;
这个高度=h;
buf_img=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_ARGB);
}
公共整数宽度(){
宽度=buf_img.getWidth();
返回宽度;
}
公共整数高度(){
高度=buf_img.getHeight();
返回高度;
}
公共颜色获取(整数列,整数行){
颜色=新颜色(buf_img.getRGB(col,row));
返回颜色;
}
公共无效集(整数列、整数行、颜色){
buf_img.setRGB(col,row,color.getRGB());
}
公开展览({
试一试{
File saveAs=新文件(“D:\\temp\\”+new Random().nextInt()+”.png”);
ImageIO.write(buf_img,“png”,saveAs);
Desktop.getDesktop().open(另存为);
}捕获(IOEX异常){
Logger.getLogger(Picture.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
公共类分色{
公共静态void main(字符串[]args){
//读入命令行参数指定的图片
图片=新图片(“D:\\qwe1.jpg”);
int width=picture.width();
int height=picture.height();
//创建三张相同尺寸的empy图片
图片绘制者=新图片(宽度、高度);
//分色
for(int col=0;col
它正在按预期工作

现在我想将整个图像的颜色设置为RGB25515351。我试着设置
pictureR.set(列、行、新颜色(255、153、51))
。但结果输出如下图所示


我怎样才能得到正确的图像?请帮助。

你最初的例子误导了你。在第一个示例中,您的代码设置不同的红色阴影(从原始红色通道中提取),创建“红标”图像,而不是像您认为的那样对图像进行“着色”

int r = color.getRed();
pictureR.set(col, row, new Color(r, 0, 0));
第二个例子是为每个像素设置一个固定的颜色,这样可以得到一个统一的橙色

pictureR.set(col, row, new Color(255, 153, 51))
您需要通过改变所有三个通道来为图像着色,就像最初改变红色值一样。有关使用合成的示例,请参见,这与您现在使用的角度不同

给定示例代码,最简单的实现是计算每个像素的灰度值(实际上是灰度值),并使用该值调整正在设置的“橙色”值。亮度的标准权重为

L = 0.2126*R + 0.7152*G + 0.0722*B
大概是

pictureR.set(col, row, new Color(255 * L/255, 153 * L/255, 51 * L/255));

你最初的例子误导了你。在第一个示例中,您的代码设置不同的红色阴影(从原始红色通道中提取),创建“红标”图像,而不是像您认为的那样对图像进行“着色”

int r = color.getRed();
pictureR.set(col, row, new Color(r, 0, 0));
第二个例子是为每个像素设置一个固定的颜色,这样可以得到一个统一的橙色

pictureR.set(col, row, new Color(255, 153, 51))
您需要通过改变所有三个通道来对图像进行着色,就像最初更改红色值一样。有关使用合成的示例,请参见,这与您现在使用的角度不同

给定示例代码,最简单的实现是计算每个像素的灰度值(实际上是灰度值),并使用该值调整正在设置的“橙色”值。亮度的标准权重为

L = 0.2126*R + 0.7152*G + 0.0722*B
大概是

pictureR.set(col, row, new Color(255 * L/255, 153 * L/255, 51 * L/255));

这看起来很像你给我“将整个图像的颜色设置为rgb 255、153、51”的图像。更好的是,发布一个@Reimeus我现在更新了这个问题,这个问题看起来很像你给我“将整个图像的颜色设置为rgb 255、153、51”的图像。发布
图片
类。更好的是,发布一个@Reimeus我现在已经更新了这个问题颜色坐标超过了限制,线程“main”java.lang.IllegalArgumentException:颜色参数超出了预期范围:红-绿Blue@swapnilgandhi正确,L在0-255范围内,因此通过像素值将其叠加超过RGB值范围(也是0-255)。在设置颜色通道时,我已更新了我的答案,将L转换为百分比(除以255)。您可能需要使用非均匀权重(如
L
公式中的权重)在你的解决方案中,取决于你想要的结果。发光不起作用,但另一件事起作用了。非常感谢。颜色坐标超出了限制,线程“main”中出现了例外java.lang.IllegalArgumentException:颜色参数超出预期范围:红-绿Blue@swapnilgandhi正确,L在0-255范围内,因此按像素值乘以它会超过RGB值范围(也是0-255)。我已更新答案,将L转换为百分比(除以255)设置颜色通道时。您可能希望在解决方案中使用非均匀权重(如
L
公式中的权重),具体取决于您所需的结果。亮度不起作用,但另一件事起作用。非常感谢。