1

我正在尝试使用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

4 回答 4

3
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。

于 2017-05-06T04:38:03.303 回答
1

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

BufferedImage newImg = new BufferedImage(raster.getWidth(), raster.getHeight(), image.getType());
于 2013-04-05T07:52:34.487 回答
0

这就是我如何处理图像尝试一下,它是为位图设计的,但你可以编辑它来做 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!");
    }
}
于 2013-04-05T07:59:01.817 回答
0

JPEG是一种有损格式,读入和写出会丢失图像中的信息,因此每次保存时看起来都会有所不同。

为避免这种情况,请使用无损格式,例如PNG

于 2013-04-05T07:51:31.030 回答