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

1

元の画像がタイプではないことはほぼ確実ですTYPE_BYTE_GRAY。入力画像と同じ画像タイプを出力することをお勧めします。

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

JPEG損失の多い形式です。読み書きすると画像から情報が失われるため、保存するたびに見た目が異なります。

これを回避するには、 PNGなどの非損失形式を使用してください。

于 2013-04-05T07:51:31.030 に答える
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 に答える