1

私はJAVA言語の初心者であり、コード(グレースケールのJPEG画像の書き込み)を使用する必要があります。かなり長い間検索しましたが、今何が問題なのかわかりません。

public static boolean writeImage(String inputFileName, String outputFileName, int[][][] imageData)
{
    BufferedImage inputImage = MyImageReader.readImageIntoBufferedImage( inputFileName );
    if ( inputImage == null )
    {
        System.out.println(" Could not open input image.");
        return false;
    }

    BufferedImage outputImage = new BufferedImage( inputImage.getWidth(), inputImage.getHeight(),
                                                   inputImage.getType() );
    WritableRaster outputRaster, inputRaster;
    inputRaster = inputImage.getRaster();
    outputRaster = inputRaster.createCompatibleWritableRaster();

     int band = 0;
    int numbands = outputRaster.getNumBands();

    int height, width;
    height = outputRaster.getHeight();
    width = outputRaster.getWidth();
    int[] pixelData = new int[ 1 ];

    for ( int y = 0; y < height; y++ )
        for ( int x = 0; x < width; x++ )
        {
            for ( band = 0; band < 1; band++ )
            {
                pixelData[ 0 ] = imageData[0][y][x];
            }
            outputRaster.setPixel(x, y, pixelData );
        }

    outputImage.setData( outputRaster );

    File outputFile = new File( outputFileName );
    try
    {
        if ( !ImageIO.write( outputImage, "jpg", outputFile ))
        {
            System.out.println("Could not find image format for output image.");
            return false;
        }
    }
    catch ( Exception e )
    {
        System.out.println("Could not write output file.");
        return false;
    }

    return true;
}

上記のコードを使用しています。コードは、入力jpegファイルからプロパティをコピーしてWritableRasteを作成するように見えるため、出力jpegファイルは同じサイズになります。

私がやっていることは、グレースケールのラスター値でいくつかの画像処理を行い、それをjpegファイルとして保存することです。

単純な4x4のケースでテストしたところ、結果は次のようになりました。

(高さ、幅)座標で保存される入力配列

1 2 3 4

5 6 7 8

15 16 17 18

25 26 27 28

保存したファイルを読み込むと、(高さ、幅)座標で表示されます

2 3 4 5

3 4 5 6

15 15 16 17

25 26 27 28

これはどのように可能ですか?何が悪いのかわかりません。画像リーダーは安全であることが証明されています。OracleのJDK1.7で実行していますが、元のコードが過去に記述されている可能性があります。しかし、これが問題にならないことを願っています。

ありがとうございました!

4

1 に答える 1

0

サード パーティのライブラリを使用でき、imgscar (Apache 2、オープン ソース、および小さい - 1 つのクラス) を利用することにした場合、実装の途中ですべての複雑なコードを切り取ることができ、次のようになります。

import org.imgscalr.Scalr.*;

public static boolean writeImage(String inputFileName, String outputFileName)
{
    BufferedImage inputImage = MyImageReader.readImageIntoBufferedImage( inputFileName );
    if ( inputImage == null )
    {
        System.out.println(" Could not open input image.");
        return false;
    }

    // This replaces everything in the middle of your original impl.
    BufferedImage outputImage = apply(inputImage, Scalr.OP_GRAYSCALE);

    File outputFile = new File( outputFileName );
    try
    {
        if ( !ImageIO.write( outputImage, "jpg", outputFile ))
        {
            System.out.println("Could not find image format for output image.");
            return false;
        }
    }
    catch ( Exception e )
    {
        System.out.println("Could not write output file.");
        return false;
    }

    return true;
}

キーはapplyメソッドの呼び出しです (事前定義されたGRAYSCALE op を画像に適用するため)。

于 2012-10-22T18:30:54.123 に答える