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“不起作用”。这是任何问题所需的基本信息。请定义什么是不起作用?错误消息是我读过的最容易理解的消息之一。为什么不读它呢?它准确地告诉你错在哪里以及错在哪里。