在java中以像素读写图像

时间:2013-04-05 07:47:02

标签: java

我正在尝试使用BufferedImage读取和写入灰度图像。但是书写图像中的像素与其来源略有不同。我不熟悉这个图像处理的东西。请任何人帮我找到我在代码中犯的错误。

这是我的代码

File InImage=new File("source.jpg");
File OutImage=new File("out.jpg");

/* code for reading the image*/
BufferedImage image=ImageIO.read(InImage);
WritableRaster raster=image.getRaster();

/*  writing the same raster to a new image */
BufferedImage newImg=new BufferedImage(raster.getWidth(), raster.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
                newImg.setData(raster);
ImageIO.write(newImg, "jpg", OutImage);

4 个答案:

答案 0 :(得分:2)

import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class ToGray {

    public static void main(String[] args) throws IOException {
        File file = new File("f:/lion.jpg");
        BufferedImage img = ImageIO.read(file);
        int width = img.getWidth();
        int height = img.getHeight();
        int[][] pixel = new int[width][height];
        Raster raster = img.getData();
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                pixel[i][j] = raster.getSample(i, j, 0);
            }
        }

        BufferedImage theImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                int value = pixel[i][j] << 16 | pixel[i][j] << 8
                        | pixel[i][j];
                theImage.setRGB(i, j, value);
            }
        }

        File outputfile = new File("f:/op.png");
        try {
            ImageIO.write(theImage, "png", outputfile);
        } catch (IOException e1) {

        }
}
}

此代码只是读取和写入灰度图像的示例。我使用光栅读取图像并将rgb设置为写入图像。 您还可以使用get和setRGB来读取和写入图像。 写入的图像格式必须是bmp,gif,png等。由于jpg,jpeg在以这些格式写入后是有损压缩,我们可能会得到全黑图像。在看到图像的数组值时,我们可能得到0或1或2个值作为像素强度。使用png。

答案 1 :(得分:1)

我几乎可以肯定原始图片不是TYPE_BYTE_GRAY类型。我建议你输出与输入图像相同的图像类型:

BufferedImage newImg = new BufferedImage(raster.getWidth(), raster.getHeight(), image.getType());

答案 2 :(得分:0)

JPEG是一种lossy格式,读取它并将其写出来会丢失图像中的信息,因此每次保存时它都会有所不同。

要避免这种情况,请使用非损耗格式,例如PNG

答案 3 :(得分:0)

这就是我弄乱图像试试看,它是为bitmaps设计的,但你可以编辑它来做jpg和png。它将它们加载到一个字节数组进行处理。这是我能找到的最基本的工作版本,因为我已经进一步开发了

 import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class ImageEdit 
{

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException 
    {
        // TODO Auto-generated method stub
        //loadBitmapToBytes("icon","resources");
        //WriteByteToBitmapFile("foo", "food", null);
    }



    public static byte [] loadBitmapToBytes (String filename, String dir) throws IOException
    {
        String a = "\\\\";
        String b = ".bmp";
        String readDir = dir + a + filename + b;
        BufferedImage image = ImageIO.read(new File(readDir));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "bmp", baos);
        byte[] img=baos.toByteArray();
        return img;
    }

    public static void writeByteToBitmapFile (String filename, String dir, byte [] img) throws IOException
    {   
        String a = "/";
        String b = ".bmp";
        String writeDir = dir + a + filename + b;
        BufferedImage imageA = ImageIO.read(new ByteArrayInputStream(img));
        ImageIO.write(imageA, "BMP", new File(writeDir));
        System.out.println(writeDir);
    }

    public static byte [] invertBitmap(byte[] img)
    {
        int indexNo = 54;

        for(int i = 54; i < (img.length-54)/3; i++)
        {
            img[indexNo] = (byte) (255-img[indexNo]);
            indexNo++;
            img[indexNo] = (byte) (255-img[indexNo]);
            indexNo++;
            img[indexNo] = (byte) (255-img[indexNo]);
            indexNo++;
        }
        return img;
    }

    public static byte [] invertSingleBitmapChannel(char chanel, byte [] img)
    {
        String a = "Color Chanel bad Input";
        int indexNo = 54;
        for (int i = 54; i < (img.length-54)/3; i++, indexNo++ )
        {
            if (chanel == 'B' || chanel == 'b')
            {

                img[indexNo] = (byte) (255-img[indexNo]);
                indexNo+=2;

            }
            else if (chanel == 'G' || chanel == 'g')
            {
                indexNo++;
                img[indexNo] = (byte) (255-img[indexNo]);   
                indexNo++;
            }
            else if (chanel == 'R' || chanel == 'r')
            {
                indexNo+=2;
                img[indexNo] = (byte) (255-img[indexNo]);   
            }
            else
            {
                System.out.println(a);
                return null;
            }
        }
        return img;

    }

    public static byte [] greyFromBitmapColor(char fromColor, byte [] img)
    {   
        int temp;
        int indexNo = 54;
        String a = "Color Chanel bad Input";
        for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
        {   
            if (fromColor == 'B' || fromColor == 'b')
            {
                temp = img[indexNo+2];
                img[indexNo] = (byte) temp;
                indexNo++;
                img[indexNo] = (byte) temp;
                indexNo++;
            }
            else if (fromColor == 'G' || fromColor == 'g')
            {
                temp = img[indexNo+1];
                img[indexNo] = (byte) temp;
                indexNo+=2;
                img[indexNo] = (byte) temp; 
            }
            else if (fromColor == 'R' || fromColor == 'r')
            {
                temp = img[indexNo];
                indexNo++;
                img[indexNo] = (byte) temp;
                indexNo++;
                img[indexNo] = (byte) temp; 
            }
            else
            {
                System.out.println(a);
                return null;
            }
        }

        return img;
    }

    public static byte [] greyFromBitmapAverage(byte [] img)
    {
        int temp;
        int indexNo = 54;
        for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
        {
            temp = (img[indexNo]+img[indexNo+1]+img[indexNo+2])/3;
            img[indexNo] = (byte) temp;
            indexNo++;
            img[indexNo] = (byte) temp;
            indexNo++;
            img[indexNo] = (byte) temp;
        }

        return img;
    }

    public static byte [] removeChannelFromBitmap(char lostColor, byte [] img)
    {
        String a = "Color Chanel bad Input";
        int indexNo = 54;
        for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
        {
            if (lostColor == 'B' || lostColor == 'b')
            {

                img[indexNo] = 0;
                indexNo+=2;

            }
            else if (lostColor == 'G' || lostColor == 'g')
            {
                indexNo++;
                img[indexNo] = 0;   
                indexNo++;
            }
            else if (lostColor == 'R' || lostColor == 'r')
            {
                indexNo+=2;
                img[indexNo] = 0;   
            }
            else
            {
                System.out.println(a);
                return null;
            }
        }

        return img;
    }

    public static byte [] greyFromDominantBitmapColor (byte [] img)
    {
        int indexNo = 54;
        long r = 0;
        long g = 0;
        long b = 0;
        char dom = 'b';

        for(int i = 54; i < (img.length-54)/3; i++, indexNo++)
        {   
                b += img[indexNo];
                indexNo++;
                g += img[indexNo];
                indexNo++;
                r += img[indexNo];  
        }

        if (b > 0)
            dom = 'b';
        if (g > b)
            dom = 'g';
        if (r > g)
            dom = 'r';

        greyFromBitmapColor(dom, img);
        return img;
    }

}

这是测试类

  import java.io.IOException;

public class TestApp {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException 
    {
        byte [] img = ImageEdit.loadBitmapToBytes("fooInv","resources");
        //ImageEdit.invertBitmap(img);
        //ImageEdit.greyFromBitmapColor('r',img);
        ImageEdit.greyFromDominantBitmapColor(img);
        //ImageEdit.invertBitmap(img);
        //ImageEdit.writeByteToBitmapFile("fooInv", "resources", img);

        System.out.println("Done!");
    }
}