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

设置图像中像素的颜色

司空元凯
2023-03-14

嘿,我正在尝试做一个程序,它加载一个彩色图像作为灰度画布,然后返回颜色点击像素。当setrgb()方法没有做它应该做的事情时,我就被困在这里了。我已经通过getRGB()从原始图像中复制了颜色,并使用setRGB()将其分配给新图像。我试图输出两个像素颜色值,但他们不一样。请帮我解决这个问题。以下是到目前为止的代码:

import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.awt.*;
import java.applet.*;

@SuppressWarnings("serial")
public class BlackWHite extends Applet implements MouseListener 
{
    String str;
    int x=0,y=0;
    BufferedImage bimg = null;
    BufferedImage nimg = null;
    BufferedImage image=null;
    double image_width =300;
    double image_height=300;
    private Image img;

    public void init()
    {
        img = null;
        str = JOptionPane.showInputDialog(null, "Enter file location : ", 
        "Choose Image", 1);  
        BufferedImage image=null;
        try {
            image = ImageIO.read(new File(str));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //getting width and height of image
        image_width = image.getWidth();
        image_height = image.getHeight();

        BufferedImage img = image;

        //drawing a new image      
        bimg = new BufferedImage((int)image_width, (int)image_height,
                             BufferedImage.TYPE_BYTE_GRAY);
        Graphics2D gg = bimg.createGraphics();
        gg.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);

        nimg = new BufferedImage((int)image_width, (int)image_height,
             BufferedImage.TYPE_INT_RGB);
        Graphics2D g = nimg.createGraphics();
        g.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);
        addMouseListener(this); 
    }

    public void loadImage()
    {
        try {
            img = getImage(getCodeBase(), "blackwhiteimage.jpg");
        } catch(Exception e) {
        }
    }

    public void paint(Graphics g)
    {       
        try {
            image = ImageIO.read(new File(str));
        } catch (IOException e) {
            e.printStackTrace();
        }
        convert(); //converting the image
        if (img == null)
            loadImage(); //draw
        g.drawImage(img, 0, 0, this);
        int c = image.getRGB(x,y);
        int red = (c & 0x0000FFFF) >> 16;  
        int green = (c & 0x0000FFFF) >> 8;  
        int blue = c & 0x0000FFFF;  
        c=(red << 16) | (green << 8) | blue;
        System.out.print("c="+c);
        nimg=bimg;
        nimg.setRGB(x,y,c);
        try {
            ImageIO.write(nimg, "jpg", new File("pixelcolor.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        g.drawImage(nimg, 0, 0, this);
        int f = nimg.getRGB(x,y);
        System.out.println("f="+f);
    }

    void convert() {
        try {
             //saving black and white image onto drive
            ImageIO.write(bimg, "jpg", new File("blackwhiteimage.jpg"));
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    @Override
    public void mouseClicked(MouseEvent me) {
        x = me.getX(); 
        y = me.getY();
        repaint();
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {     
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
    }
}

共有1个答案

顾亦
2023-03-14

最基本的问题是你试图在灰度颜色空间中设置图像的颜色。这不是applet中唯一的bug,但您可以从它开始。尝试使用另一种方法将图像转换为灰度,同时将其保留在RGBA中,如下面所示:将RGB图像转换为灰度图像,减少java中的内存

 类似资料:
  • 对于给定的多色PNG(带透明度),最好的/快速的惯用方式是什么: 创建一个重复的 关于SO有几个相关的问题,但是我还没有找到有效的方法。

  • 我试图从眼动跟踪结果创建一个热图(显示用户在屏幕上最频繁查看的位置)。 对于用户经常查看的像素,我想设置不透明的红色,对于不太频繁的橙色,等等...我使用红色到绿色的色阶。但是对于频率最低的像素,我希望它们不仅显示绿色,而且是透明的。 问题是,当我尝试改变颜色时,例如使用它实际上并没有根据新旧颜色将像素作为平均值着色,它只是显示一些新的、看起来奇怪的颜色。 图像与alpha RGBA值设置为50:

  • 本文向大家介绍python 设置输出图像的像素大小方法,包括了python 设置输出图像的像素大小方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 为了记住不忘 发一下博客常看常记。 位置在plt.show之前就可以 以上这篇python 设置输出图像的像素大小方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我对Android很陌生,正在做我自己的迷你项目,我想改变一个特定像素的颜色。在寻找如何做到这一点时,我在几年前遇到了这个问题。我尝试了myBitmap。setPixel(10,10,Color.rgb(45,127,0)) ,但当我在手机上激活它时,我激活这行代码的那一刻它就崩溃了。每当我与位图交互时,它似乎就会崩溃<代码>int x=myBitmap。getHeight() 这一行也会使应用程

  • 我正在尝试将此java代码转换为python: 我在python中尝试过这个: 然而问题是我在python中得到不同的值。 为什么java返回负整数值,我如何在python中获得相同的结果?

  • 问题内容: 有什么方法可以检查PNG图像的选定点(x,y)是否透明? 问题答案: 基于Jeff的答案,您的第一步将是创建PNG的画布表示。以下内容将创建一个屏幕外画布,该画布的宽度和高度与您的图像相同,并在其上绘制图像。 之后,当用户单击时,使用和获取位置。然后可以用来获取像素: 因为您只抓取一个像素,所以pixelData是一个包含四个像素的R,G,B和A值的四项数组。对于Alpha,任何小于2