[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) {
...
}