圖片過大引起的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等第三方圖片載入框架,所以遇到很多坑。後面的專案會採用第三方載入,有同樣問題的可以去了解下
相關推薦
圖片過大引起的OOM,ImageView無法顯示問題
最近處理圖片遇到一些問題,網上的圖片壓縮很多都是使用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
有n跟棍子,棍子i的長度為ai。想要從中選出3跟棍子組成周長儘可能長的三角形。請輸出最大的周長,若無法輸出三角形則輸出0. //本題目是針對於陣列內棍子的長度為小到大的排列
例如: n = 5 ; a = {2,3,4,5,10} 輸出: 12 (選擇3,4,5時) #include <stdio.h> #include <stdlib.h> int main() { int n; int
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型別,走了不少彎路。去研究