2011-10-20 4 views
3

でビットマップに大きな画像をロードこんにちは私はSDカードから画像をロードするためのコードの下に使用しています、byte[]配列は、SDカードから読み込まれたバイトが含まれ、正しくはアンドロイド

Bitmap picture=BitmapFactory.decodeFile("/sdcard..."); 

または

Bitmap picture= BitmapFactory.decodeByteArray(byte[]..); 

を実行していますFileInputstreamを使用して、nullではありません。上記のコードはどちらもうまく動作します。問題は、画像がより大きくなるような画像では機能しないということです。私は1.8メガバイトの画像を持っています。私のアプリは画像をデコードしている間にクラッシュします。ラージイメージに使用されるメソッドは失敗します。 解決策はありません。

+0

イメージのサイズを変更してから使用してください。 – user370305

+0

元のイメージを使用する必要があるため、何が原因で解決できるのでしょうか。 – user960971

+0

アンドロイドのヒープのサイズのため、ビットマップはヒープ内のメモリを割り当てます。 – user370305

答えて

3

Bitmap picture=BitmapFactory.decodeFile("/sdcard..."); 
    int width = picture.getWidth(); 
    int height = picture.getWidth(); 
    float aspectRatio = (float) width/(float) height; 
    int newWidth = 70; 
    int newHeight = (int) (70/aspectRatio);  
    picture= Bitmap.createScaledBitmap(picture, newWidth, newHeight, true); 
+0

問題。 – Stephan

+0

よく問題は、このコマンドでアプリケーションがクラッシュすることです... Bitmap picture = BitmapFactory.decodeFile( "/ sdcard ..."); – user960971

+0

実際のデバイスやエミュレータで作業していますか? –

6

はパージ可能なビットマップを作成するようにしてください。..画像にあなたが必要とする任意のサイズのサイズを変更するには、以下のコードを使用してください。

byte[] data = ...(read byte array from file) 
    BitmapFactory.Options opt = new BitmapFactory.Options(); 
    opt.inPurgeable = true; 
    Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length, opt); 
1

Android VMには、画像のサイズを制限するメモリの制限があります。再構成されたイメージをイメージビューに表示するには、次のコードを使用できます。

decode_options.inJustDecodeBounds = true; 
BitmapFactory.decodeFile(temp,decode_options); //This will just fill the output parameters 
if(decode_options.outWidth > image_width 
     || decode_options.outHeight > image_height) 
{ 
    float scale_width,scale_height; 

    scale_width = ((float)decode_options.outWidth)/image_width; 
    scale_param = scale_width; 
    scale_height = ((float)decode_options.outHeight)/image_height; 

    if(scale_param < scale_height) 
     scale_param = scale_height; 
} 

decode_options.inJustDecodeBounds = false; 
decode_options.inSampleSize = (int)(scale_param + 1); 
decode_options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
decoded_data = 
     BitmapFactory.decodeFile(temp,decode_options);