我需要使用 [PNGJ] (http://code.google.com/p/pngj/) 库从 PNG 输入流中解码位图和元数据。问题是解码元数据会推进流,然后我不能使用 bitmap = BitmapFactory.decodeStream()。
自己创建位图是可以的,但是如果我需要使用插值来缩放位图,我宁愿使用 BitmapFactory。要使用它,每次我必须使用 PNGJ 获取元数据和使用 BitmapFactory 获取位图时,我都必须创建 InputStream 的副本。从单个 PNGJ 调用(至少对于最常见的 ARGB_8888 格式)返回元数据和位图会很好。
简而言之,我必须复制要由 Java 库使用的流,这看起来很浪费。返回位图将是一种解决方案。
// 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) {
...
}