Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为颜色范围指定新的颜色值_Java_Image_Grayscale - Fatal编程技术网

Java 如何为颜色范围指定新的颜色值

Java 如何为颜色范围指定新的颜色值,java,image,grayscale,Java,Image,Grayscale,我需要我的程序通过图像中的像素,将它们更改为灰度。然后我需要获取一系列灰度值,并使用if-else和if-else-if语句对它们进行着色。有人能帮我弄清楚吗 以下是我目前的代码: import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; import javax.swing.JFrame; public class Colorize {

我需要我的程序通过图像中的像素,将它们更改为灰度。然后我需要获取一系列灰度值,并使用if-else和if-else-if语句对它们进行着色。有人能帮我弄清楚吗

以下是我目前的代码:

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

public class Colorize {

    BufferedImage image;
    int width;
    int height;

    public Colorize()  {
        try {
            File input = new File("Grayscale.jpg");
            image = ImageIO.read(input);
            width = image.getWidth();
            height = image.getHeight();

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

                for(int j=0; j<width; j++){
                    int col = image.getRGB(i, j);
                    Color c = new Color(col, true);
                    int red = c.getRed();
                    int green = c.getGreen();
                    int blue = c.getBlue();
                    if ((red>= 1)&&(red<=30))  {
                        c = new Color(c.getRed() + 10, c.getGreen(), c.getBlue());
                    }
                    if ((red>= 31)&&(red<=60))  {
                        c = new Color(c.getRed(), c.getGreen() + 10, c.getBlue());
                    }
                    if ((red>= 61)&&(red<=90))  {
                        c = new Color(c.getRed(), c.getGreen(), c.getBlue() + 10);
                    }
                    if ((red>= 91)&&(red<=120))  {
                        c = new Color(c.getRed() + 10, c.getGreen() + 10, c.getBlue());
                    }
                    if ((red>= 121)&&(red<=150))  {
                        c = new Color(c.getRed() + 10, c.getGreen(), c.getBlue() + 10);
                    }
                    if ((red>= 151)&&(red<=180))  {
                        c = new Color(c.getRed(), c.getGreen() + 10, c.getBlue() + 10);
                    }
                    if ((red>= 181)&&(red<=210))  {
                        c = new Color(c.getRed() - 10, c.getGreen(), c.getBlue());
                    }
                    if ((red>= 211)&&(red<=240))  {
                        c = new Color(c.getRed(), c.getGreen() - 10, c.getBlue());
                    }
                    else {
                        c = new Color(c.getRed(), c.getGreen(), c.getBlue());
                    }
                    image.setRGB(j,i,c.getRGB());
                }
            }

            File output = new File("Colorize.jpg");
            ImageIO.write(image, "jpg", output);

        } catch (Exception e) {}
    }

    static public void main(String args[]) throws Exception 
    {
        Colorize obj = new Colorize();
    }
}
import java.awt.*;
导入java.awt.image.buffereImage;
导入java.io.*;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
公共类着色{
缓冲图像;
整数宽度;
内部高度;
公共着色(){
试一试{
文件输入=新文件(“Grayscale.jpg”);
图像=图像IO.read(输入);
宽度=image.getWidth();
高度=image.getHeight();

对于(inti=0;i而言,某个地方一定存在异常,不幸的是,您捕获了异常,并且什么也不做

替换

catch (Exception e) {}


这将帮助您找到发生的情况。我猜您将得到一个FileNotFoundException,因为Grayscale.jpg可能不在您的工作目录中。

要将图像转换为灰度图像,您需要颜色加权平均值。0.2126 r 0.7152 g 0.0722 b。以这种方式获取颜色与getRed()getGreen()和getBlue()相同工作。最后加上你的颜色并用setRGB设置。这将使你的图像变成灰度

for(int i=0; i<image.getWidth(); i++){
      for(int j=0; j<image.getHeight(); j++){
          int color = image.getRGB(i,j);
          int r = ((color >> 16) & 0xFF) * 0.2126;
          int g = ((color >> 8) & 0xFF) * 0.7152;
          int b = ((color) & 0xFF) * 0.0722;
          int finalColor = (r << 16) | (g << 8) | b;
          image.setRGB(i,j,finalColor);
      }
 }
(inti=0;i16)&0xFF的
0.2126;
INTG=((颜色>>8)和0xFF)*0.7152;
int b=((颜色)和0xFF)*0.0722;

int finalColor=(r)到目前为止,代码做了什么?它编译了吗?你想如何给你的灰度图像上色?看看下面。我在代码中发现了问题。我没有收到错误。它只是没有将新图像保存到文件夹中。你怎么能确定没有错误,因为在出现错误时你什么都不做?如果没有错误,你至少应该写一个destination文件等于原始文件。下面是我现在得到的错误:java.lang.ArrayIndexOutOfBoundsException:坐标越界!在sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)在java.awt.image.BuffereImage.getRGB(BuffereImage.java:917)在Colorize.(Colorize.java:23)在Colorize.main在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.invoke)(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
int col=image.getRGB(i,j)
应该是
int col=image.getRGB(j,i);
因为getRGB的第一个参数是X,第二个参数是Y.Dude。这就解决了整个问题。太棒了。非常感谢你帮助解决这个问题。你给了我一个非常重要的教训。谢谢!
for(int i=0; i<image.getWidth(); i++){
      for(int j=0; j<image.getHeight(); j++){
          int color = image.getRGB(i,j);
          int r = ((color >> 16) & 0xFF) * 0.2126;
          int g = ((color >> 8) & 0xFF) * 0.7152;
          int b = ((color) & 0xFF) * 0.0722;
          int finalColor = (r << 16) | (g << 8) | b;
          image.setRGB(i,j,finalColor);
      }
 }