在将图像用样本大小解码后,将其解码后,将其解码为单位

  • 本文关键字:解码 为单位 图像 样本 android
  • 更新时间 :
  • 英文 :


我是Android的初学者。在从SD卡中解码(大小1600x1200)的图像时,我会遇到以下错误。解码位图后,我必须将动画应用于ImageView以在全屏中播放幻灯片之类的图像。我正在使用以下计算来解码位图后获取样品。

while (true) {
    if (width_tmp / 2 < REQUIRED_WIDTH || height_tmp / 2 < REQUIRED_HEIGHT )
        break;
    width_tmp /= 2;
    height_tmp /= 2;
    scale *= 2;
}

任何人都可以帮我解决这个问题。

Error:
11-09 13:39:15.100: E/DhcpStateMachine(424): DHCP failed on wlan0: Timed out waiting for DHCP to finish
11-09 13:39:15.300: E/WifiStateMachine(424): IP configuration failed
11-09 13:39:32.840: E/dalvikvm-heap(2511): Out of memory on a 20155408-byte allocation.
11-09 13:39:32.870: E/AndroidRuntime(2511): FATAL EXCEPTION: AsyncTask #1
11-09 13:39:32.870: E/AndroidRuntime(2511): java.lang.RuntimeException: An error occured while executing doInBackground()
11-09 13:39:32.870: E/AndroidRuntime(2511):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.lang.Thread.run(Thread.java:856)
11-09 13:39:32.870: E/AndroidRuntime(2511): Caused by: java.lang.OutOfMemoryError
11-09 13:39:32.870: E/AndroidRuntime(2511):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:301)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at com.example.testproject1.Imgloader.loadImageFromSDCard(Imgloader.java:60)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at com.example.testproject1.Imgloader.access$0(Imgloader.java:50)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at com.example.testproject1.Imgloader$SDLoadImageTask.doInBackground(Imgloader.java:177)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at com.example.testproject1.Imgloader$SDLoadImageTask.doInBackground(Imgloader.java:1)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-09 13:39:32.870: E/AndroidRuntime(2511):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-09 13:39:32.870: E/AndroidRuntime(2511):     ... 5 more
11-09 13:39:32.970: E/dalvikvm-heap(2511): Out of memory on a 20155408-byte allocation.
11-09 13:39:46.530: E/DhcpStateMachine(424): DHCP failed on wlan0: Timed out waiting for DHCP to finish
11-09 13:39:46.749: E/WifiStateMachine(424): IP configuration failed
11-09 13:40:18.180: E/DhcpStateMachine(424): DHCP failed on wlan0: Timed out waiting for DHCP to finish
11-09 13:40:18.399: E/WifiStateMachine(424): IP configuration failed
11-09 13:40:18.399: E/WifiStateMachine(424): Failed 10 times, Disabling 3

我使用以下方法来扩展基于经验确定的最大内存大小 max_size的图像,而我的目的为2,000,000。

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
    InputStream inputStream = getContentResolver().openInputStream(
            selectedImage);
    UriHelper uriHelper = new UriHelper(this);
    mSaveFilenameRoot = uriHelper.getFilenameRoot(selectedImage);
    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(inputStream, null, o);
    try {
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // Find the correct scale value. A power of 2 is best (fastest)
    // however using the scaling that maximizes the size of the image.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    // maximum size due to heap size limitations
            // Bytes required based on width x height x 4 bytes per pixel
    int max_size = 2000000;
    while (true) {
        if (((width_tmp / scale) * (height_tmp / scale) * 4) < max_size)
            break;
        scale++;
    }
    // Decode the image at the appropriate scale
    inputStream = getContentResolver().openInputStream(selectedImage);
    o = new BitmapFactory.Options();
    o.inSampleSize = scale;
    o.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap tmpBitmap = BitmapFactory.decodeStream(inputStream, null, o);
    try {
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return tmpBitmap;
}

由于您还没有提到您可以定位的SDK版本,因此可以通过渲染脚本

获得最佳性能

也可以在http://developer.android.com/guide/topics/renderscript/compute.html

上找到其用法的示例

最新更新