编写灰度图像时出错

时间:2015-06-21 07:21:57

标签: java image-processing

在下面的代码中,我尝试读取灰度图像,将像素值存储在2D数组中,并使用不同的名称重写图像。 代码是

    package dct;

    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    import java.awt.image.Raster;
    import java.io.File;
    import javax.imageio.ImageIO;

    public class writeGrayScale
    {

        public static void main(String[] args)
        {
            File file = new File("lightning.jpg");
            BufferedImage img = null;
            try
            {
                img = ImageIO.read(file);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }

            int width = img.getWidth();
            int height = img.getHeight();
            int[][] arr = new int[width][height];

            Raster raster = img.getData();

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    arr[i][j] = raster.getSample(i, j, 0);
                }
            }

            BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_GRAY);
            byte[] raster1 = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
            System.arraycopy(arr,0,raster1,0,raster1.length);
            //
            BufferedImage image1 = image;
            try
            {
                File ouptut = new File("grayscale.jpg");
                ImageIO.write(image1, "jpg", ouptut);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }    
        }// main
    }// class

对于此代码,错误是

Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at dct.writeGrayScale.main(writeGrayScale.java:49)
Java Result: 1

如何删除此错误以写入灰度图像?

2 个答案:

答案 0 :(得分:1)

我发现了这个:“ArrayStoreException - 如果由于类型不匹配而导致src数组中的元素无法存储到dest数组中。” http://www.tutorialspoint.com/java/lang/system_arraycopy.htm

两个想法:

  1. 您正在将一个int数组复制到一个字节数组中。
  2. 这不是例外的一部分,但尺寸是否合适? arr是一个二维数组,raster1是一维数组。
  3. 你不能只是在二维方式中更改字节数组,忽略你正在调用的方法的输出。

答案 1 :(得分:1)

将此int[][] arr更改为byte[] arr

    byte[] arr = new byte[width * height * 4];
    for (int i = 0, z = 0; i < width; i++) {
        for (int j = 0; j < height; j++, z += 4) {
            int v = getSample(i, j, 0);
            for (int k = 3; k >= 0; --k) {
                arr[z + k] = (byte)(v & 0xff);
                v >>= 8;
            }
        }
    }