1

[PNGJ] (http://code.google.com/p/pngj/) ライブラリを使用して、PNG 入力ストリームからビットマップ データとメタ データの両方をデコードする必要があります。問題は、メタデータをデコードするとストリームが進むため、bitmap = BitmapFactory.decodeStream() を使用できないことです。

自分でビットマップを作成することは問題ありませんが、補間を使用してビットマップをスケーリングする必要がある場合は、むしろ BitmapFactory を使用します。それを使用するには、PNGJ を使用してメタデータを取得し、BitmapFactory を使用してビットマップを取得する必要があるたびに、InputStream のコピーを作成する必要があります。単一の PNGJ 呼び出しからメタデータとビットマップを返すと便利です (少なくとも最も一般的な ARGB_8888 形式の場合)。

要するに、ストリームを Java ライブラリで使用するためにコピーする必要があり、無駄に見えます。ビットマップを返すことが 1 つの解決策になります。

    // register an auxilary chunk name 
    PngChunk.factoryRegister(ThumbNailProvider.chunkID, chunkPROP.class); 

    // reader for the stream
    PngReader pngr = new PngReader(inStream, "debug label PNG reader");
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    PngWriter pngw = new PngWriter(outputStream, pngr.imgInfo);

    // copy pre-data chunks
    pngw.copyChunksFirst(pngr, ChunkCopyBehaviour.COPY_ALL_SAFE);

    // copy image data
    for (int row = 0; row < pngr.imgInfo.rows; row++) {
        ImageLine l1 = pngr.readRow(row);
        pngw.writeRow(l1, row);
    }

    // copy after-data chunks
    pngw.copyChunksLast(pngr, ChunkCopyBehaviour.COPY_ALL); 

    pngr.end(); // close inStream but not its copy
    pngw.end(); // close out stream

    // save a copy of the stream for Java Libraries;
    data.inputStream = new ByteArrayInputStream(outputStream.toByteArray());



    // read the chunk
    ChunksList chunkList = pngr.getChunksList();
    PngChunk chunk = chunkList.getById1(L2ThumbNailProvider.chunkID);
    if (chunk != null) {
    ... 
    }
4

1 に答える 1

1

これは、2 つの独立したストリーム コンシューマー (たとえば ) を持つことの問題であり、Class1.parse(inputStream)それらClass2.decode(inputStream)が同じ単一のストリームを消費することを望んでいます。消費者がストリームをどのように食べるかを制御できない場合、単純でエレガントなソリューションはありません (例: )。

シンプルな解決策ですが、あまり洗練されておらず、おそらく実用的ではありません: ストリームを閉じてから再度開く (ネットワーク ストリームから読み取っている場合は実行できません)、完全なストリーム コンテンツをメモリにバッファリングするか、一時ファイルに保存します。

あなたの具体的なケースでは、私が考えることができる代替案は次のとおりです。

1) PNGJ がデータを消費してデコードし、ビットマップを自分で作成して、ピクセルをsetPixels()で埋めます。これは、他の不都合の中でも特に、適切な色変換を行う必要があります。

2) PngReader を InputFilterStream として使用して、メタデータのみを解析し、完全なストリームをコンシューマーに渡すようにします。現在のところ、PNGJ コードを微調整しない限り、これは不可能です。私はそれを見て、この機能を実装する場合は、ここに投稿します。

于 2012-12-29T16:03:38.423 に答える