Java将图像输出到灰度和深褐色
我正在尝试读取图像并将其输出为新的灰度和深褐色版本。我已经了解了其中的大部分,但转换只适用于某些图像。对于其他人,这只会导致错误消息:Java将图像输出到灰度和深褐色,java,image-manipulation,Java,Image Manipulation,我正在尝试读取图像并将其输出为新的灰度和深褐色版本。我已经了解了其中的大部分,但转换只适用于某些图像。对于其他人,这只会导致错误消息: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.ja
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:318)
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:918)
at ChangeColor.color2gray(ChangeColor.java:64)
at ChangeColor.main(ChangeColor.java:129)
我认为这和图像的rgb值有关,但我不确定如何调整它以使此代码适用于任何图像。谢谢你的帮助
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
public class ChangeColor{
static BufferedImage readImage( String fname ) throws Exception {
BufferedImage image = ImageIO.read( new File(fname) );
return( image );
}
public static void saveImage( BufferedImage img, File file ) throws IOException {
ImageWriter writer = null;
java.util.Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
if( iter.hasNext() ){
writer = (ImageWriter)iter.next();
}
ImageOutputStream ios = ImageIO.createImageOutputStream( file );
writer.setOutput(ios);
ImageWriteParam param = new JPEGImageWriteParam( java.util.Locale.getDefault() );
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ;
param.setCompressionQuality(0.98f);
writer.write(null, new IIOImage( img, null, null ), param);
}
public static BufferedImage color2gray( BufferedImage inImage ) {
int width = inImage.getWidth();
int height = inImage.getHeight();
BufferedImage outImage = new BufferedImage( width, height, BufferedImage.TYPE_3BYTE_BGR );
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
{
int pic= inImage.getRGB(i,j);
int in_r = ((pic>>16) & 0xFF);
int in_g = ((pic>>8) & 0xFF);
int in_b = (pic & 0xFF);
float gray = (float)(in_r * 0.2126 + in_g * 0.7152 + in_b * 0.0722)/256;
Color color = new Color (gray, gray, gray);
int RGB = color.getRGB();
outImage.setRGB (i,j,RGB);
}
}
}
return( outImage );
}
public static BufferedImage color2sepia( BufferedImage inImage ) {
int width = inImage.getWidth();
int height = inImage.getHeight();
BufferedImage outImage = new BufferedImage( width, height, BufferedImage.TYPE_3BYTE_BGR );
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
{
int pic= inImage.getRGB(i,j);
int in_r = ((pic>>16) & 0xFF);
int in_g = ((pic>>8) & 0xFF);
int in_b = (pic & 0xFF);
float out_r = (float)(((in_r * .393) + (in_g *.769) + (in_b * .189))/256);
if (out_r>1)
out_r = 1;
float out_g = (float)(((in_r * .349) + (in_g *.686) + (in_b * .168))/256);
if (out_g>1)
out_g = 1;
float out_b = (float)(((in_r * .272) + (in_g *.534) + (in_b * .131))/256);
if (out_b>1)
out_b = 1;
Color color = new Color (out_r, out_g, out_b);
int RGB = color.getRGB();
outImage.setRGB (i,j,RGB);
}
}
}
return( outImage );
}
public static void main(String[] args) throws Exception {
BufferedImage colorImage, grayImage, sepiaImage;
if (args.length != 1)
System.out.println( "usage is: java ChangeColor filename" );
else
{
colorImage = readImage ( args[0] );
grayImage = color2gray ( colorImage );
sepiaImage = color2sepia( colorImage );
saveImage( grayImage, new File( "gray" + args[0] ) );
saveImage( sepiaImage, new File( "sepia"+ args[0] ) );
}
}
}
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.net.URL;
导入javax.imageio.IIOImage;
导入javax.imageio.imageio;
导入javax.imageio.ImageWriteParam;
导入javax.imageio.ImageWriter;
导入javax.imageio.plugins.jpeg.JPEGImageWriteParam;
导入javax.imageio.stream.ImageOutputStream;
公共类变色{
静态BuffereImage readImage(字符串fname)引发异常{
buffereImage image=ImageIO.read(新文件(fname));
返回(图像);
}
公共静态void saveImage(buffereImage img,File File)引发IOException{
ImageWriter=null;
java.util.Iterator iter=ImageIO.getImageWritersByFormatName(“jpg”);
if(iter.hasNext()){
writer=(ImageWriter)iter.next();
}
ImageOutputStream ios=ImageIO.createImageOutputStream(文件);
writer.setOutput(ios);
ImageWriteParam参数=新的JPEGImageWriteParam(java.util.Locale.getDefault());
参数setCompressionMode(ImageWriteParam.MODE_显式);
参数设置压缩质量(0.98f);
writer.write(null,新IIOImage(img,null,null),param);
}
公共静态BuffereImage color2gray(BuffereImage inImage){
int-width=inImage.getWidth();
int height=inImage.getHeight();
BuffereImage outImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_3BYTE_BGR);
对于(int i=0;i16)&0xFF);
int in_g=((pic>>8)和0xFF);
int in_b=(pic&0xFF);
浮动灰色=(浮动)(in_r*0.2126+in_g*0.7152+in_b*0.0722)/256;
颜色=新颜色(灰色、灰色、灰色);
int RGB=color.getRGB();
outImage.setRGB(i,j,RGB);
}
}
}
返回(outImage);
}
公共静态BuffereImage color2sepia(BuffereImage inImage){
int-width=inImage.getWidth();
int height=inImage.getHeight();
BuffereImage outImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_3BYTE_BGR);
对于(int i=0;i16)&0xFF);
int in_g=((pic>>8)和0xFF);
int in_b=(pic&0xFF);
浮点数=浮点数(((in_r*.393)+(in_g*.769)+(in_b*.189))/256);
如果(输出>1)
out_r=1;
浮出=浮出((in_r*.349)+(in_g*.686)+(in_b*.168))/256);
如果(输出>1)
out_g=1;
浮点数b=(float)((in_r*.272)+(in_g*.534)+(in_b*.131))/256);
如果(out_b>1)
out_b=1;
颜色=新颜色(out\r、out\g、out\b);
int RGB=color.getRGB();
outImage.setRGB(i,j,RGB);
}
}
}
返回(outImage);
}
公共静态void main(字符串[]args)引发异常{
缓冲图像彩色图像,灰度图像,深褐色图像;
如果(args.length!=1)
println(“用法是:JavaChangeColor文件名”);
其他的
{
colorImage=readImage(args[0]);
grayImage=color2gray(colorImage);
乌贼墨=color2sepia(colorImage);
保存图像(灰度图像,新文件(“灰度”+args[0]);
saveImage(sepiaImage,新文件(“sepia”+args[0]);
}
}
}
您的错误如下:
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
{
int pic= inImage.getRGB(i,j);
for(int i=0;iDefine“不起作用”。这是任何问题所需的基本信息。请定义什么是不起作用?错误消息是我读过的最容易理解的消息之一。为什么不读它呢?它准确地告诉你错在哪里以及错在哪里。