当前位置: 首页 > 知识库问答 >
问题:

有人能解释一下为什么这个代码不把图像中的其他像素列都涂成红色吗?

郭璞
2023-03-14

这段代码是对我正在构建的更大程序的测试。它应该将图像中的每一个像素行都涂成红色,但结果是下面添加的图像。有人能解释为什么没有显示红色吗?

package code;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

public class Pixel {

BufferedImage image;
int width;
int height;

public Pixel() throws IOException {
    File input = new File("/Users/SanchitBatra/Desktop/Depixelator.jpg");
    image = ImageIO.read(input);
    width = image.getWidth();
    height = image.getHeight();
}

public void changePixels() throws IOException{

        for(int i=0; i<height; i++){

            for(int j=0; j<width; j++){

                int red;
                //  Color c = new Color(image.getRGB(j, i));
                if(i%2==0){

                    red = 255;
                }
                else{
                    red=0;
                }
                int green = 0;
                int blue = 0;
                Color newColor = new Color(red, green, blue);

                image.setRGB(j,i,newColor.getRGB());

            }
        }

        File output = new File("/Users/SanchitBatra/Desktop/grayscale.jpg");
        ImageIO.write(image, "jpg", output);

    }


static public void main(String args[]) throws Exception {

    Pixel obj = new Pixel();
    obj.changePixels();
}
}

这是生成的图像:

编辑:该程序正在使用彩色图像作为源做它应该做的事情。感谢所有的贡献!我今天学到了很多:)

共有2个答案

甘骞尧
2023-03-14
    < li >如果您想将列设为红色,您应该沿宽度方向而不是高度方向将其设为红色。当前代码将使交替行变为红色。 < li >我认为您的代码没问题,请尝试放大/缩小您的图像,看看您是否获得了想要的效果。

谢谢,哈桑

裴甫
2023-03-14

试试这个:

public void changePixels() throws IOException{

    BufferedImage bi = new BufferedImage(side,side,BufferedImage.TYPE_INT_ARGB);
    int[] pixels = new int[width*height];

    for(int i=0; i<height; i++){

        for(int j=0; j<width; j++){
            int colorIn = image.getRGB(j,i);
            int redIn = 255&(colorIn<<16);
            int greenIn = 255&(colorIn<<8);
            int blueIn = 255&(colorIn);

            if(i%2==0){

                redIn = 255;
            }


            pixels[i+j*width] = (255<<24)|(redIn<<16)|(greenIn<<8)|blueIn;



        }
    }
    bi.setRGB(0, 0, width, height, pixels, 0, width);
    File output = new File("/Users/SanchitBatra/Desktop/grayscale.jpg");
    ImageIO.write(bi, "jpg", output);

}

我在这里向您展示了如何使用位移位提取颜色值,以向您展示如何更好地控制您的过程。这也会保留原始像素值,如果红色值是偶数列,则只会覆盖红色值。

 类似资料:
  • 我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。

  • 它通常会打印“z”。为什么它不返回分段错误?因为我试图访问一个不应该存在的索引,因为strB的大小(索引数量)等于tam_strA,它等于3。 另外,做有什么不同/问题吗?

  • 问题内容: 我只是在android上开始,而我的java很生锈。我不记得曾经见过像这样嵌套在另一个函数中的函数。有人可以向我确切解释final的作用,并解释为什么您要在另一个函数中嵌套这样的功能吗? 问题答案: 这是一个匿名类。实际发生的情况是正在使用重写的函数创建 的子类。 关于匿名类的最优雅的事情之一是,它们使您可以在需要的地方准确定义单发类。此外,匿名类具有简洁的语法,可减少代码中的混乱情况

  • 我这里有一些关于Java的练习问题。我们应该在不使用编译器的情况下确定答案。 参考以下方法: 调用product(6)时的输出是什么? D)48 E)70 根据答案,正确的输出是48。我真的不明白为什么这是真的。6不符合基本情况,所以转到else语句。那么,乘积(6-2)=乘积(4),乘积(2)得到乘积(0),乘积(2)得到乘积(0),得到6*4,4*2,2*0,0*0。但那是32,不是48?是不

  • 日安, 我有一个问题,在我的代码中,一个声明在函数之外有一个错误。 谢谢

  • 这是我从骡子3到骡子4转换的第一个项目。我与mule4一起工作,但在Mule3是新的。有谁能帮帮我吗?你能告诉我这些自定义处理器和变压器在这个mule3代码中的用途吗?而Mule4中的等价代码会是什么呢?在骡子4中没有像这样的自定义变压器。请帮帮我..