繁体   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