簡體   English   中英

從相機壓縮位圖

[英]Compress Bitmap from Camera

我需要通過網絡發送從相機拍攝的圖像。 圖像太大,無法創建使用bitmap.compress(); 看起來Gmail應用程序可以附加來自攝像頭的圖像,同時保持其較大的像素大小,但大大減少了文件大小。

這將無法工作,因為我getBitmap()將返回一個Image to large來分配,我不想將其下采樣到較小的大小。

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    getBitmap().compress(Bitmap.CompressFormat.JPEG, 70, baos);

關於如何在不超過總記憶的情況下做同樣的事情的任何想法?

更新:

對於回到這個主題的人,我按照Phil的回答,使用Apache MultiPartEntity輕松完成工作。 (它處理從磁盤到網絡的流文件) http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/MultipartEntity.html

在通過網絡發送之前使用壓縮可能有意義嗎? 的InflaterInputStream上的發送器側和DeflaterOutputStream接收側看起來像可行的組合。

ADDENDUM嘗試使用另一種方法:

FileOutputStream fos = new FileOutputStream(file); //intermediate file to store compressed image
InputStream is=this.getStream(imageUri); //image uri taken from camera
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize=2; //try to decrease decoded image
options.inPurgeable=true; //purgeable to disk
Bitmap bitmap=BitmapFactory.decodeStream(is, null, options);
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos); //compressed bitmap to file

由於您尚未明確定義“通過網絡發送”的含義,因此很難提供具體建議。

但是,如果你想發送一個無損圖像(或者比已經發生的損失更少),我認為你不能壓縮得更多,因為JPEG已經壓縮了。 它使用有損壓縮,所以如果你增加JPEG壓縮,你會丟失細節(雖然可能不是你注意到的,因為它是基於頻率而不是像素)

如果您只需要通過網絡發送,那么為什么不直接打開InputStream,並將數據直接發送到網絡?

希望這會有所幫助 - 如果您能提供更多詳細信息,我會更新答案。

最好的祝願,

Phil Lello

您可以使用較低版本的圖像,即分辨率為512x384(迷你縮略圖)。 檢查這個答案,了解如何獲取迷你縮略圖。

縮略圖已經壓縮到80%。

我認為你只能在本機代碼中執行此操作,您可以在其中分配更多內存。 這意味着您需要使用和編譯本機庫(如libjpeg )或一些完整的包(如ImageMagick )以支持從各種圖像格式讀取。

有了這個,你根本不會使用Bitmap類進行壓縮。 您的本機代碼將負責讀取和寫入圖像文件。 如果您設法編譯庫,則您的本機代碼不應超過幾十行。

除非你知道C並且已經使用過JNI和Android NDK ,否則這並不容易。 特別是,為Android編譯第三方庫有時會很棘手。

但我相信,原生是這里唯一的解決方案。

可能是預分割圖像; 壓縮每個人並在最后恢復聽起來合乎邏輯。

這是一些嘗試,

http://kalanir.blogspot.com/2010/02/how-to-split-image-into-chunks-java.html

http://www.anddev.org/multimedia-problems-f28/chunk-of-a-big-big-image-t6211.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM