2

絶対パスを持つ画像を表示しようとしています。理論的には機能するはずのstackoverflowでこのコードに出くわしましたがBitmap too big to be uploaded into a texture、ほとんどの画像でエラーが発生するため、別の方法を探しています。驚くべきことに、これを行う方法については、これ以外に例はありません。

これは私がしようとしているものです:

Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);                  
ImageView image = new ImageView(context);
image.setImageBitmap(myBitmap);
layout.addView(image);

ちなみに、私が扱っている画像はデフォルトのカメラアプリで撮影したものなので、珍しい形式やサイズはありません(ギャラリーアプリでも問題なく見ることができます)。それらをレイアウトに追加するにはどうすればよいですか?

4

2 に答える 2

0

inSampleSizeヒープに適合する小さいサンプル サイズ ( ) を使用することをお勧めします。

最初に、ヒープに適合するビットマップを作成します。必要なビットマップよりもわずかに大きい可能性があります。

BitmapFactory.Options bounds = new BitmapFactory.Options();
this.bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, bounds);
if (bounds.outWidth == -1) { // TODO: Error }
int width = bounds.outWidth;
int height = bounds.outHeight;
boolean withinBounds = width <= maxWidth && height <= maxHeight;
if (!withinBounds) {
    int newWidth = calculateNewWidth(int width, int height);
    float sampleSizeF = (float) width / (float) newWidth;
    int sampleSize = Math.round(sampleSizeF);
    BitmapFactory.Options resample = new BitmapFactory.Options();
    resample.inSampleSize = sampleSize;
    bitmap = BitmapFactory.decodeFile(filePath, resample);
}

2 番目のステップは、Bitmap.createScaledBitmap() を呼び出して、必要な正確な解像度の新しいビットマップを作成することです。

一時ビットマップの後に必ずクリーンアップして、そのメモリを再利用してください。(変数をスコープ外にして GC に処理させるか、大量の画像をロードしていてメモリが不足している場合は、変数に対して .recycle() を呼び出します。)

于 2013-01-21T05:37:01.763 に答える
0

以下のコードを使用して最初に画像のサイズを変更してから、次のように設定してImageViewください。

 public static Drawable GetDrawable(String newFileName)
{
    File f;
    BitmapFactory.Options o2;
    Bitmap drawImage = null;
    Drawable d = null;
    try
    {           
        f = new File(newFileName);          
        //decodes image and scales it to reduce memory consumption
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;            
        o.inTempStorage = new byte[16 * 1024];          
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);            
        //The new size we want to scale to
        final int REQUIRED_SIZE = 150;          
        //Find the correct scale value. It should be the power of 2.
        int scale = 1;
        while ((o.outWidth / scale / 2 >= REQUIRED_SIZE) && (o.outHeight / scale / 2 >= REQUIRED_SIZE))
            scale *= 2;         
        //Decode with inSampleSize
        o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;            
        drawImage = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        //Bitmap bmp = pictureDrawableToBitmap((PictureDrawable) drawable);         
        d = new BitmapDrawable(drawImage);
        //drawImage.recycle();
        //new BitmapWorkerTask          
    }
    catch (FileNotFoundException e)
    {
    }
    return d;
}

上記の方法を以下のように使用します。

imageView.setImageBitmap(myBitmap);

于 2013-01-21T05:51:01.040 に答える