获取Drawable的byte []而不创建位图

时间:2013-01-25 20:47:59

标签: android bitmap drawable

我需要将PNG发送到服务器。一个非常简单的解决方案是使用以下代码创建Bitmap并将其转换为byte[]

final Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.some_image);
final ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 100, os);
final byte[] data = os.toByteArray();

由于我想节省时间和内存,我希望在不需要创建Bitmap的情况下实现这一点。

一个想法是将Drawable作为File访问,但我不知道如何获得正确的路径。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

harism给了我最后的提示:使用Resoureces.openRawResource方法之一。

这是我的最终解决方案:

private byte[] fetchImageData(Resources res) throws IOException {
    final AssetFileDescriptor raw = res.openRawResourceFd(R.drawable.some_image);
    final FileInputStream is = raw.createInputStream();

    // there are plenty of libraries around to achieve this with just one line...
    final ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    int nRead;
    final byte[] data = new byte[16384];

    while ((nRead = is.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }

    buffer.flush();

    return buffer.toByteArray();
}

在我的情况下,我的PNG为250x200像素,文件大小为42046字节。 Bitmap方法需要大约500毫秒,原始方法需要3毫秒。

希望有人可以使用此解决方案。