天天看點

Handling large/high resolution images

Google TV devices have higher display resolution. If you provide low resolution or small images in your layouts, they will appear pixelated, fuzzy, or grainy. This is not a good experience for the user. Instead, use high resolution images. Remember, though, that downloading and storing high-resolution images may cause "out of memory" errors. To avoid these errors, follow these tips: 

   Load images only when they're displayed on the screen. For example, are displaying multiple images in a <code>GridView</code>, <code>ListView</code> or    <code>Gallery</code>,  only load an image when its getView() is called. 

Scale down very large images to a more appropriate size as you download them; otherwise, downloading the image may cause an "out of memory" error.   Here is sample code that does this scaling while downloading:  

// Get the source image's dimensions  

   BitmapFactory.Options options = new BitmapFactory.Options();  

   options.inJustDecodeBounds = true; // this does not download the actual image, just downloads headers.  

   BitmapFactory.decodeFile(IMAGE_FILE_URL, options);  

   int srcWidth = options.outWidth;  // actual width of the image.  

   int srcHeight = options.outHeight;  // actual height of the image.  

   // Only scale if the source is big enough. This code is just trying to fit a image into a certain width.  

   if(desiredWidth &gt; srcWidth)  

     desiredWidth = srcWidth;  

   // Calculate the correct inSampleSize/scale value. This helps reduce memory use. It should be a power of 2.  

   int inSampleSize = 1;  

   while(srcWidth / 2 &gt; desiredWidth){  

     srcWidth /= 2;  

     srcHeight /= 2;  

     inSampleSize *= 2;  

   }  

   float desiredScale = (float) desiredWidth / srcWidth;  

   // Decode with inSampleSize  

   options.inJustDecodeBounds = false;  // now download the actual image.  

   options.inDither = false;  

   options.inSampleSize = inSampleSize;  

   options.inScaled = false;  

   options.inPreferredConfig = Bitmap.Config.ARGB_8888;  // ensures the image stays as a 32-bit ARGB_8888 image.   

                                                         // This preserves image quality.  

   Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(IMAGE_FILE_URL, options);  

   // Resize  

   Matrix matrix = new Matrix();  

   matrix.postScale(desiredScale, desiredScale);  

   Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0,  

       sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true);  

   sampledSrcBitmap = null;  

   // Save  

   FileOutputStream out = new FileOutputStream(LOCAL_PATH_TO_STORE_IMAGE);  

   scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);  

   scaledBitmap = null;  

     本文轉自xyz_lmn51CTO部落格,原文連結:http://blog.51cto.com/xyzlmn/816814,如需轉載請自行聯系原作者