Java 如何为颜色范围指定新的颜色值
我需要我的程序通过图像中的像素,将它们更改为灰度。然后我需要获取一系列灰度值,并使用if-else和if-else-if语句对它们进行着色。有人能帮我弄清楚吗 以下是我目前的代码: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 {
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);
}
}