2016-12-01 11 views
-2
ImageViewの

に画像やステッカー(WEBP形式)のリストをステッカーを示す上で起こりました。 ImageViewの上にステッカーを表示するはrecycleviewに示されなければならない

、この[リポジトリ](https://github.com/EverythingMe/webp-android)が使用されます。このリポジトリは、バイト配列は、ビットマップに変換し、リポジトリのライブラリを使用して、バイト配列に変換し、(WebP for Android

ステッカーファイルが外部ストレージからreadedされるこのポストの提案 解決策の一つであったし、最終的にビットマップが上に示されていますimageView。コードの下に「NATIVE_WEB_P_SUPPORTが」、「decodeWebP」メソッド「がメモリのうち」、この方法で作業時間のほとんどで罰金、時にはと呼ばれるエラーは、この上で起こっている偽のときステッカーファイルが

private void ShowStickerOnImageView(String stickerPath){ 
File file = new File(stickerPath); 
int size = (int) file.length(); 
byte[] bytes = new byte[size]; 

BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file)); 
buf.read(bytes, 0, bytes.length); 
buf.close(); 

Bitmap bitmap = null; 
boolean NATIVE_WEB_P_SUPPORT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; 
if (!NATIVE_WEB_P_SUPPORT) { 
    bitmap = WebPDecoder.getInstance().decodeWebP(bytes); 
} else { 
    bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
} 

holder.imageView.setImageBitmap(bitmap); 
} 

..... 

public Bitmap decodeWebP(byte[] encoded, int w, int h) { 
int[] width = new int[]{w}; 
int[] height = new int[]{h}; 

byte[] decoded = decodeRGBAnative(encoded, encoded.length, width, height); 
if (decoded.length == 0) return null; 

int[] pixels = new int[decoded.length/4]; 
ByteBuffer.wrap(decoded).asIntBuffer().get(pixels); 

return Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888); 
} 

ビットマップに変換します方法。時間のほとんどは、このエラーは、これらの線

int[] pixels = new int[decoded.length/4]; 
ByteBuffer.wrap(decoded).asIntBuffer().get(pixels); 
return Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888); 

に起こっている私は、プログラムステッカーファイルサイズを小さくすることができますステッカーファイルのバイト配列の長さは、大きい見つかりましたか?私はバイト配列のサイズを減らすために、解決策を探したい。

答えて

0

Bitmapをネイティブサイズとして使用していますが、ImageViewに適用しています。減少Viewの大きさにBitmap

Bitmap yourThumbnail= Bitmap.createScaledBitmap(
    theOriginalBitmap, 
    desiredWidth, 
    desiredHeight, 
    false 
); 

はそれを注意してください:

public static Bitmap createBitmap(int colors[], int width, int height, Config config) { 
    return createBitmap(null, colors, 0, width, width, height, config); 
} 

public static Bitmap createBitmap(DisplayMetrics display, int colors[], 
     int offset, int stride, int width, int height, Config config) 

を呼び出しますそして、それはにつながる:

Bitmap bm = nativeCreate(colors, offset, stride, width, height, 
         config.nativeInt, false); 

基本的に、あなたはcアノテーションは何もない理由でメモリに巨大なBitmapを作成します。これが電話の場合は、アプリケーション用に20 MBのサイズを想定します。 800 * 600 * 4の画像、yelds 1920000バイト。下のように(RGB_8888と比べてピクセルあたりの半分のバイトammount、)RGB_565を使用するなど、画質、または事前に再スケールソースビットマップ。

+0

答えのステッカー –

+0

等に使用されるテキストは、あなたが持っている主な問題は、お使いのディスプレイよりも大きい 'Bitmap'を作成している場合は特にRGB_565原因の画像低品質を使用。どちらかは、その大きさに応じて 'Bitmap'をロードし、その後、スケールされたバージョンをロードしたり、' View'のサイズを取得し、元のビットマップまたはファイルを変更し、それをロードいけません。使用する "Android 4.0以前の"デフォルトライブラリはありません。そして、そこにその理由は、大規模 'Bitmap'を表示する必要がある場合は、低リソースデバイスには、Googleのヘルプを探して、ですが、' Magically.load(largeBitmap) '関数を期待してはいけません – Bonatti

関連する問題