-2

画像を書き込むImageEncoderを書いていTGAます。ファイルを正常に書き込むことができましたがTGA、終了する代わりに、関連するコードを以下に示します。[RRRRRGGGGGBBBBBA][RGBBBBBA]

int lastRow = minY + height;
for (int row = minY; row < lastRow; row += 8) {
    int rows = Math.min(8, lastRow - row);
    int size = rows * width * numBands;

    // Grab the pixels
    Raster src = im.getData(new Rectangle(minX, row, width, rows));
    src.getPixels(minX, row, width, rows, pixels);

    for (int i = 0; i < size; i++) {
        //output.write(pixels[i] & 0xFF);
        //corrected
        //before conversion (source image) pixel in RGBA8888 format.
        int o = (int) pixels[i];
        //Need to convert here...
        short converted = ?;
        //need to write out RGB5551
        output.write(converted);
    }
}

私が達成しようとしていることを明確にするために... 色深度が RGBA8888 の png 形式のソース画像があります。この画像を色深度 RGBA5551 の tga 形式に変換する必要があります。上記の for ループは、個々のピクセルにアクセスする場所です。だから私が求めているのは、32 ビットの int (RGBA8888) を正しく読み取り、それを 16 ビットの short (RGBA5551) に変換するにはどうすればよいですか?

4

2 に答える 2

1

残念ながら、誰も私を助けることができませんでしたが、コミュニティと答えを共有したいと思います.

 private void writeoutFromPNGFile(int width, int numBands, int minY, int height,         RenderedImage im, int minX) throws IOException {
    System.out.println("Writing from PNG data.");
    //convertTo2DWithoutUsingGetRGB(im);
    //now start writing the file...
    int[] pixels = new int[8 * width * numBands];

    int count = 0;

    // Process 8 rows at a time so all but the last will have
    // a multiple of 8 pixels.  This simplifies PBM_RAW encoding.
    int lastRow = minY + height;
    for (int row = minY; row < lastRow; row += 8) {
        int rows = Math.min(8, lastRow - row);
        int size = rows * width * numBands;

        // Grab the pixels
        Raster src = im.getData(new Rectangle(minX, row, width, rows));
        src.getPixels(minX, row, width, rows, pixels);

        for (int i = 0; i < size; i += 4) {
            //output.write(pixels[i] & 0xFF);
            int red = pixels[i];
            int green = pixels[i + 1];
            int blue = pixels[i + 2];
            int alpha = pixels[i + 3];
            //System.out.println("Pixel Value: " + o);
            convertTo5551(red, green, blue, alpha);
        }

    }
}


int convertTo5551(int r, int g, int b, int a) throws IOException {
    int r5 = r * 31 / 255;
    int g5 = (int) g * 31 / 255;
    int b5 = (int) b * 31 / 255;
    int a1 = (a > 0) ? 0 : -1;
    int rShift = (int) r5 << 11;
    int bShift = (int) g5 << 6;
    int gShift = (int) b5 << 1;
    // Combine and return
    int abgr5551 = (int) (bShift | gShift | rShift | a1);
    output.write(new BigDecimal((abgr5551) & 0xFF).byteValue());
    output.write(new BigDecimal((abgr5551 >> 8) & 0xFF).byteValue());
    return abgr5551;
}

色は線形演算を使用して変換されます - 良い結果を得るための良い考えではありません. 減色は、ImageMagick などのプログラムで行う必要があります。

于 2013-10-01T12:36:01.370 に答える
0

Raster は自身のソース (四角形) を知っているので、src.getPixels( 0, 0, width,rows,pixels). でも試しませんでした。

于 2013-09-29T09:13:16.517 に答える