有趣。在JAVA中创建和读取RGB值是不同的

时间:2015-12-05 00:50:44

标签: java image jpeg rgb bufferedimage

今天我去学校并向老师展示了这个活动,但他并不理解和惊讶。

对于“1.jpg”,首先我向右移动红色,绿色,蓝色值并打印此值。在我向左移动所有这些值之后,以及在创建新图片之后。“2.jpg”(所以相同的图片)

最后我看了两张照片并比较了这些。这些看起来像彼此但这些不一样。我检查了比较这些。

edgetag* e = (edgetag*)malloc(sizeof(edgetag));   //SEGMENTATION FAULT SEEMS TO LIE HERE

2 个答案:

答案 0 :(得分:2)

JPEG通常是“有损”格式(取决于选项)。这意味着源RGB值在存储时不会再现完全。您可以设置jpeg写入的选项是无损的,但这会增加文件大小,并且首先会失败使用jpeg的目的。

我的猜测是,如果您要为BMP文件或任何无损格式尝试相同的代码,图像将完全相同。

加载压缩图像然后将其写回压缩格式的事实会引入“副本副本”问题。你的原始图像已经有损了。您已加载它,然后再次启用压缩将其保存。每次完成此操作时,都会丢失一些原始信息。

类似于拍摄照片。每次完成此操作,您将丢失信息。

答案 1 :(得分:0)

JPEG压缩过程中有几个步骤可以更改输入。

  1. 彩色图像从RGB转换为YCbCr。两种颜色系统之间没有1:1匹配,因此可以剪切值。

  2. DCT是对整数值执行的浮点运算。这会导致舍入差异(通常最多+/- 1)。

  3. 量化过程对DCT系数执行整数除法,将多个变为0并将其他值中的分数减去。

  4. 结果是一张图片很少出现。