【问题标题】:Size of png file is reducedpng 文件的大小减小了
【发布时间】:2017-04-01 08:01:29
【问题描述】:

我将 png 图像中所有像素的最后 4 位更改为零。为什么图像的大小减少到不到一半?我相信 png 是无损压缩。我是否能够检索嵌入的数据。(这里我向所有像素添加了 0000,但在实际情况下我需要添加不同的数据)我使用的是 vb 2015。我使用的代码附在下面。

Dim image1 As Bitmap = New Bitmap("C:\STEG\originalimage.png")

        For i As Integer = 0 To image1.Height - 1
            For j As Integer = 0 To image1.Width - 1

                Dim value As Color = image1.GetPixel(j, i)
                Dim t1 As Byte = value.R
                Dim t2 As Byte = value.G
                Dim t3 As Byte = value.B

                t1 = t1 And 240
                t2 = t2 And 240
                t3 = t3 And 240
                image1.SetPixel(j, i, Color.FromArgb(255, t1, t2, t3))

            Next

        Next

        image1.Save("C:\STEG\originalimageedited.png")

【问题讨论】:

  • "我可以检索嵌入的数据吗" 为什么需要问我们这个问题?你为什么不自己尝试一下?
  • 除了我的回答:压缩算法可以重复的数据越多,它可以删除的原始数据就越多。而且它删除的数据越多,压缩文件的大小就越小。
  • 例如,如果您有一个包含完全随机数据的文件,您将无法对其进行太多压缩(如果有的话),因为没有什么可重复的,其中没有模式。
  • 很高兴能帮上忙!请注意,我所描述的内容非常笼统。该方法因不同的压缩算法而异。我不知道PNG具体是如何工作的,但根据*,它使用DEFLATE

标签: vb.net png


【解决方案1】:

PNG 是一种无损图像压缩格式,是的。但是,如果它是无损的,与尺寸的大幅减小没有任何关系。影响它的是压缩算法的工作方式。

我不知道 PNG 的算法是如何工作的,但基本上压缩是关于重复数据。例如如果每个字节的最后 4 位是0000,像这样:

1000 0000
0000 0000
1101 0000
0110 0000

...然后压缩算法可以例如将其表示为:

repeat 0000 every 4 bits

或:

1000 4-0
4-0  4-0
1101 4-0
0110 4-0

(4-0 indicates that it should write four '0' bits)

在压缩文件中可能只占用几个字节,而在未压缩文件中这四位占每个字节的一半。

因此,如果您有 1 KB = 1024 字节的颜色数据并像上面的第一个示例一样对其进行压缩,则文件大小将(粗略地说)缩小到 512 字节 + 表示重复的几个字节。

【讨论】:

    最近更新 更多