1. 程式人生 > >圖片過大引起的OOM,ImageView無法顯示問題

圖片過大引起的OOM,ImageView無法顯示問題

最近處理圖片遇到一些問題,網上的圖片壓縮很多都是使用bitmap.compress(),但是發現還是有OOM

原先的程式碼,有問題的:

public String cutPictureQuality(Bitmap bitmap, String fname) {

        String fileName = fname + ".jpg";// UUID.randomUUID().toString().replace("-","") + ".jpg";
        String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + context.getPackageName() + "/UserIcon";
        //Environment.getExternalStorageDirectory() + File.separator + savePackage;

        // 判斷資料夾存在
        File file = new File(filePath);
        if (file != null && !file.exists()) {
            file.mkdirs();
        }

        try {

            // 第一次壓縮
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);

            FileOutputStream fos = new FileOutputStream(new File(filePath, fileName));

            int options = 100;
            // 如果大於150kb則再次壓縮,最多壓縮三次
            while (baos.toByteArray().length / 1024 > 150 && options != 10) {
                // 清空baos
                baos.reset();
                // 這裡壓縮options%,把壓縮後的資料存放到baos中
                bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
                options -= 30;
            }
            fos.write(baos.toByteArray());
            fos.close();
            baos.close();

        } catch (Exception e) {
        }
        return filePath + File.separator + fileName;
    }

以上使用compress壓縮,得到的結果載入時還是會發生oom,網上找了資料說compress壓縮的是圖片儲存到記憶體的大小,

載入的時候,獲取的圖片大小還是不變的

現在採用的壓縮方式是

 public Bitmap cutPictureSize(String filePath, int reqWidth, int reqHeight) {

        Display mDisplay = ((Activity) context).getWindowManager().getDefaultDisplay();
//        int width = mDisplay.getWidth();
//        int height = mDisplay.getHeight();

        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;//只是獲取圖片邊框,不載入圖片
        BitmapFactory.decodeFile(filePath, options);
        options.inSampleSize = 4;//設定取樣比例 這裡是四行取一行,4列取1列,得到的大小是原來的1/16
        options.inJustDecodeBounds = false;  //然後設定載入圖片
        return BitmapFactory.decodeFile(filePath, options);
    }

載入的思路基本是這樣,也可以根據圖片的width和height來計算inSamplesize

 private int cutBySize(BitmapFactory.Options options, int reqWidth, int reqHeight) {

        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        return inSampleSize;
    }

基本就是這樣,因為剛開始沒有了解過Glide等第三方圖片載入框架,所以遇到很多坑。後面的專案會採用第三方載入,有同樣問題的可以去了解下


相關推薦

圖片引起OOMImageView無法顯示問題

最近處理圖片遇到一些問題,網上的圖片壓縮很多都是使用bitmap.compress(),但是發現還是有OOM原先的程式碼,有問題的:public String cutPictureQuality(Bitmap bitmap, String fname) {

UIWebview圖片縮放至螢幕寬度

webview在手機上顯示的內容經常非常寬,顯示出來之後要手動縮放才能正常瀏覽。但如果用  C程式碼   [self.webView setScalesPageToFit:YES];   則會被居中縮放的非常小,如圖:(請無視我demo裡的title。。。)   其實

安卓載入圖片而導致OOM記憶體溢位的解決方法(巨坑....)

如果圖片太大會造成OOM記憶體溢位的錯誤,需要用Bitmap的壓縮機制。 如果跳轉的頁面含有圖片可能會導致跳轉失敗。 比如說我這裡是一旦觸發了某個按鍵,就修改該xml的圖片和文字說明 則setImageResource應該改成這樣imageview.setImageBitm

Android讀取本地圖片圖片導致OOM問題。

這是畢設中,我要讀取本地相機拍攝到的相片時,遇到的問題,提示OOM,然後強制關閉,這篇部落格點選開啟連結裡提到了一種方法能解決這個問題。我把主要內容寫下: public final class BitMapUtil { private static final

轉載 | 防止頁面圖片出現橫滾動條問題

縮小 overflow 剪切 ont tro src idt 圖片路徑 解決方法 - JS方法 - 就是一小段JS加到頁面中就可以,下面把這段代碼貼出來: 1 jQuery(document).ready(function () { 2 jQuery("bod

圖片時前端如何優化載入

一、 採用不減解析度的壓縮方式進行壓縮 用PS開啟圖片,點選點選“檔案”——“儲存為Web所用格式” 將圖片儲存為Web所用格式,點選“儲存”。 或者尋找第三方壓縮方式https://tinypng.com/ 二、將圖片改為jpeg漸進式圖片 上圖是標準型jpg格式的

深度學習圖片--------------實現將一張圖片裁剪成二圖片併合並

import os import cv2 import numpy as np import tqdm #cv2讀取一律寫成預設模式 #path = 'D:\\program\\fast-neural-style-tensorflow-master\\C\\pic\\' path = 'D:\\pr

Mybatis中使用流式查詢避免資料量導致OOM

一、前言 前面介紹了裸露JDBC 方式使用流式程式設計,下面介紹下MYbatis中兩種使用流式查詢方法 二、Mybaits中MyBatisCursorItemReader的使用 2.1 配置 MyBatisCursorItemReader的注入 <bean id="myMyBa

Mysql中使用JDBC流式查詢避免資料量導致OOM

一、前言 java 中MySQL JDBC 封裝了流式查詢操作,通過設定幾個引數,就可以避免一次返回資料過大導致 OOM。 二、如何使用 2.1 之前查詢 public void selectData(String sqlCmd) throws SQLException {    v

ThinkPHP--圖片導致的一系列問題

最近在上傳圖片並新增水印時,無意中發現圖片超過2M的都無法上傳,而且頁面不報錯,程式碼也沒法兒往下進行,經過多番查詢資料發現需要修改PHP的配置檔案即php.ini 1.在wamp\bin的資料夾下,把apache和php 裡的php.ini都進行修改,需要修改的引數如下: mem

JSP檔案編譯失敗異常如is exceeding the 65535 bytes

空行的去除沒有幫助,減少引用的js會有小幫助,但在jsp本身很大的時候作用有限。建議嘗試修改應用伺服器的web.xml檔案(在tomcat下位於conf目錄下,在jboss下位於server\default\deploy\jbossweb.sar目錄下 ),修改如下圖所示之處 <

BitmapFactory.decodeFile圖片記憶體溢位

/** 從快取中獲取圖片 **/ public Bitmap getImage(final String url) { final String path = getDirectory() + "/" + convertUrlToFileName(url); Sy

轉載自:Hadas-Wk MyEclipse中建立WEB工程運用標籤顯示圖片無法顯示問題

首先,客戶端瀏覽器訪問jsp頁面的時候,解析圖片路徑後是在伺服器的tomcat的工程下面去尋找,在MyEclipse中是在WebRoot線面去找,這是關鍵所在。情況一:把圖片picture.jpg(比如這個圖片名是picture.jpg)放在和JSP檔案同一目錄下(即預設的W

android上傳圖片處理

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOu

django+uwsgi+nginx數據表引起"out of memory for query result"

mit 文本 timeout 方式 uwsgi 項目 corn cor worker 昨天負責的一個項目突然爆“out of memory for query result”。 背景 項目的數據表是保存超過10m的文本數據,通過json方式保

Tomcat:解決Tomcat可以在eclipse啟動無法顯示默認頁面的操作

瀏覽器 mil 分享 http 網址 size -s 希望 tom 解決Tomcat可以在eclipse啟動,卻無法顯示默認頁面的操作 今天在eclipse中配置好tomcat後訪問不到它的主頁,但是能運行自己的項目,一直找不到原因,百度之後最後解決了這個問題,總結如下

Discuz 部署500 – 內部服務器錯誤。 您查找的資源存在問題因而無法顯示

無法顯示 查找 安全性 超過 基於 方法 true iis windows7 Windows7 IIS 500 – 內部服務器錯誤解決方案 1、解決方法:打開IIS,在功能視圖中找到“錯誤頁”,雙擊進去後,看最右邊的“操作”下的“編輯功能設置…”,將“錯誤響應”下的“詳細錯

使用SpringMVC的crud操作時進行資料修改但是修改成功後頁面無法顯示lastName屬性值(被修改的那條記錄)

我這個錯誤的原因在於,把map的鍵寫錯了,它必須和類名第一個字母小寫相同 @ModelAttribute public void getEmployee(@RequestParam(value="id",required=false) Integer id, Map&l

【外掛篇】前段bootstrap-table-treegrid試手解決無法顯示樹形列表或者圖示不顯示問題。

  說明:具體程式碼操作我就不貼了。官方有正規的例子!bootstrap-table-examples傳送 使用注意事項: 傳入的id和pid可以是string型別的(我後臺返回的是Long型別轉換成string來顯示的),開始看到有的地方說必須使用number型別,走了不少彎路。去研究