如何在Android中保存JPG中的所有原始图像数据?

如何在Android中保存JPG中的所有原始图像数据?,android,jpeg,Android,Jpeg,我正在使用一个客户机,它的颜色样式指南是完全不可变的,作为其应用程序的一部分,有一个功能可以将它们提供的JPG发送到服务器 我目前正在将图像转换为ByTestStream并上传,但是图像的颜色与原始图像略有不同 这是我创建字节流的代码 ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap b = BitmapFactory.decodeResource(getResources(), uploadImgId); b.

我正在使用一个客户机,它的颜色样式指南是完全不可变的,作为其应用程序的一部分,有一个功能可以将它们提供的JPG发送到服务器

我目前正在将图像转换为ByTestStream并上传,但是图像的颜色与原始图像略有不同

这是我创建字节流的代码

ByteArrayOutputStream stream = new ByteArrayOutputStream();
Bitmap b = BitmapFactory.decodeResource(getResources(), uploadImgId);
b.compress(Bitmap.CompressFormat.JPEG, 100, stream);            
byte[] bitmapdata = stream.toByteArray();
我使用的是100%压缩,所以我不知道为什么它会以任何方式改变图像

将JPG移动到设备的文件系统并简单地上传一个文件会更可靠吗? 或者,使用PNG而不是JPG是否更可靠?(我猜PNG对待颜色信息的方式与JPG不同)


TIA

执行摘要是,您似乎正在使用JPEG压缩位图。JPEG是有损的。如果颜色必须完全正确,则需要无损编解码器,如PNG

长话短说如下:

JPEG是一种有损编解码器。它通过丢失图片中大多数人不会注意到的信息来压缩图片

这实际上可以分为两个阶段:

JPEG压缩之前的一个非常常见但不是强制性的步骤是色度下采样。顾名思义,这涉及到丢失某些人类通常不敏感的颜色信息

此外,DCT变换是JPEG中的下一个强制性步骤,其工作原理是从图片中消除人类通常不会注意到的细微细节。这可能会在某些图片中(如带有锐边)导致进一步的颜色变化

另一方面,PNG是一种无损编解码器——它的工作原理是消除图像中信息的冗余,但决不会丢失信息。它由RLE和Lempel-Ziv编码组成,这些编码是完全可逆的


简而言之,使用PNG并保存原始颜色,但要注意图片会更大,因此上载时间会更长,手机数据账单也可能更大。

执行摘要是,您似乎正在拍摄位图并使用JPEG压缩它。JPEG是有损的。如果颜色必须完全正确,则需要无损编解码器,如PNG

长话短说如下:

JPEG是一种有损编解码器。它通过丢失图片中大多数人不会注意到的信息来压缩图片

这实际上可以分为两个阶段:

JPEG压缩之前的一个非常常见但不是强制性的步骤是色度下采样。顾名思义,这涉及到丢失某些人类通常不敏感的颜色信息

此外,DCT变换是JPEG中的下一个强制性步骤,其工作原理是从图片中消除人类通常不会注意到的细微细节。这可能会在某些图片中(如带有锐边)导致进一步的颜色变化

另一方面,PNG是一种无损编解码器——它的工作原理是消除图像中信息的冗余,但决不会丢失信息。它由RLE和Lempel-Ziv编码组成,这些编码是完全可逆的

简而言之,使用PNG并保存原始颜色,但要注意图片会更大,因此上载时间会更长,手机数据账单也可能更大。

。JPG&JPEG(联合摄影专家组)压缩是一种有损压缩机制。这意味着,虽然您解压缩的文件可能看起来像原始文件,但很可能,如果您对该文件进行二进制比较,您会发现许多差异。JPG(和我认为.PNG)文件都基于离散余弦变换(傅里叶变换的子集),部分压缩会丢弃任何图像平方根(通常发生在您碰到尖锐边界/像图像中的直线时),因此一些信息总是丢失。存储图像而不丢失的唯一方法是将原始图像保存为位图,或者可能使用.JPG时代以前存在的一些旧的运行长度编码方案,但不要对压缩方式抱有太多期望,最好的情况下可能会减少50%

如果您需要更好的解释,请返回Msg,但它会变得非常冗长-Joe

。JPG&JPEG(联合摄影专家组)压缩是一种有损压缩机制。这意味着,虽然您解压缩的文件可能看起来像原始文件,但很可能,如果您对该文件进行二进制比较,您会发现许多差异。JPG(和我认为.PNG)文件都基于离散余弦变换(傅里叶变换的子集),部分压缩会丢弃任何图像平方根(通常发生在您碰到尖锐边界/像图像中的直线时),因此一些信息总是丢失。存储图像而不丢失的唯一方法是将原始图像保存为位图,或者可能使用.JPG时代以前存在的一些旧的运行长度编码方案,但不要对压缩方式抱有太多期望,最好的情况下可能会减少50%


如果您需要更好的解释,请返回Msg,但它会变得非常冗长-Joe

Dredel:如果您在编译时拥有这些图像,为什么要在上载这些图像时浪费用户的时间、电池和带宽?对每个用户都这样做?只需在编译时将文件复制到服务器上一次就可以了。是否需要进行解码/重新编码?您能将原始JPEG发送到服务器吗?@commonware,因为图像需要在每个实例中命名用户特定的名称@吉米,有没有办法避免解码/重新编码?我需要用一个备用文件名上传原始文件。Dredel:“因为图像需要在每个实例中指定用户特定的名称”——然后向Web服务器发送一个命令,说“yo,dawg,将名为Foo的股票图像复制到名为Bar,yo的用户特定值”。您不需要上传图像,因为服务器有