
以上圖片大家可以看到,雖然是個jpg格式的文件,但是本質上是個動圖。
但是發現在咱的圖片模塊下,本地存儲的圖片只有一幀,問題出在哪里呢?
http獲取到的byte[]數據是沒問題的
斷點跟蹤了下,發現問題出現在最后一句壓縮圖片尺寸的時候。
public static Bitmap getScaledBitMap(byte[] data, int width, int height) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeByteArray(data, 0, data.length, options); float srcWidth = options.outWidth; float srcHeight = options.outHeight; int inSampleSize = 1; if (srcHeight > height || srcWidth > width) { if (srcWidth > srcHeight) inSampleSize = Math.round(srcHeight / height); else inSampleSize = Math.round(srcWidth / width); } options = new BitmapFactory.Options(); options.inSampleSize = inSampleSize; return BitmapFactory.decodeByteArray(data, 0, data.length, options); }
最后的解決之道是,不經過Bitmap,直接把http獲取到的byte[]數據寫入到本地;在取出的時候,才進行圖片尺寸壓縮。
/** * 寫入bytes * * @param url * @param bytes * @return */ public boolean save(String url, byte[] bytes) { if (bytes == null || bytes.length == 0) return false; url = trans2Local(url); File file = new File(url); if (file.exists()) return true; ZIO.createNewFile(file); FileOutputStream fos = null; try { fos = new FileOutputStream(file); fos.write(bytes); return true; } catch (Exception e) { e.printStackTrace(); Log.e("存儲出錯", e.getMessage()); } finally { try { fos.close(); } catch (Exception e) { e.printStackTrace(); } } return false; }
這種做法額外的好處是,不再理會奇怪的圖片格式質量問題。
比如我們用Bitmap保存圖片的時候還要取判斷圖片類型,還要去指定壓縮精度(如果100的話圖片尺寸比原圖還要大很多,真奇怪)
Bitmap.CompressFormat format = url.toLowerCase().indexOf("png") > 0 ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG;
bitmap.compress(format, 75, fos);
