2

PNGをサーバーに送信する必要があります。非常に簡単な解決策の1つは、を作成し、次のコードを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();

時間とメモリを節約したいので、ビットマップを作成せずにこれを実現したいと思います。

Drawableとしてアクセスするのも1つのアイデアFileですが、正しいパスを取得する方法がわかりません。

何か案は?

4

1 に答える 1

1

ハリズムは私に最後のヒントを与えました:方法の1つを使用してください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();
}

私の場合、250x200ピクセルのPNGと42046バイトのファイルサイズがありました。Bitmapアプローチには約500ms、生のアプローチには3msが必要です。

誰かがこのソリューションを使用できることを願っています。

于 2013-01-26T12:12:27.303 に答える