0

我保存 bmp 格式的代码:

ImgResult.Save(dlgSavePicture.FileName, System.Drawing.Imaging.ImageFormat.Bmp)

我已经尝试了代码,输出是 512x512 bmp 图像,大小为 1 MB

如果我使用 ms Paint 创建 515x512 bmp 图像,大小为 768kb

我试图打开图像并重新保存为 bmp 大小仍然是 1MB

512x512 bmp 图像大小可以在 512x512 中达到 1mb 吗?还是我的代码有问题?

4

2 回答 2

5

BMP 是一种非常简单的图像文件格式。只是一个描述图像的小标题(大小、像素格式、分辨率、颜色表),然后是一个像素数据块。从技术上讲,它可以用 RLE 压缩,但编码器不再麻烦了。像素数据取决于像素格式,古代有1bpp、4bpp和8bpp,它们需要一个颜色表。16bpp 可能发生,不寻常的,正常的是 24bpp (RGB) 和 32bpp (ARGB)。换句话说,每个像素 3 或 4 个字节。

所以是的,512 x 512 x 4 ~= 1 兆字节。MSPaint 对它使用的像素格式非常明确。这是一个非常简单的绘画程序,不支持 alpha 混合效果。所以使用 24bpp(无 alpha),512 x 512 x 3 ~= 786 KB。您可以使用 Paint.NET 创建 32bpp BMP。

您在自己的程序中获得哪一个取决于您如何创建 Bitmap 对象。简单版本使用与视频适配器相同的像素格式。在所有 32bpp 的现代机器上。16bpp 可能会发生,这是非常不寻常的。如果您想要其他格式,则必须使用带有 PixelFormat 参数的Bitmap 构造函数。

否则有一个很好的理由这样做,默认像素格式通常不是最佳的。最好的 10 倍是与视频适配器的像素格式完全匹配的格式。选择在 32bppArgb 和 32bppPArgb 之间。P 表示“预乘”,alpha 值预先应用于 RGB 值。如果您使用 Graphics.FromImage() 自己在位图中进行大量绘图,则 Argb 是最有效的。PArgb 是最有效的绘画,像素数据可以直接blitted 到视频帧缓冲区,而无需转换。快十倍。您通常关心绘画速度,这是程序中最明显的工件。

如果您关心图像文件的大小,那么没有比 PNG 更好的选择了。它使用 LZW 压缩来压缩像素数据,典型的压缩率为 50% 或更高。JPEG 也是一个不错的选择,压缩率要高得多,但它是有损的。它通过丢弃图像细节来实现高比率。适用于照片,通常是没有文字或线条的图像,否则不必多次压缩。

于 2015-08-09T10:42:19.800 回答
0

我试过这段代码

Public Function ConvertTo24bpp(img As Image) As Bitmap
    Dim bmp = New Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
    Using gr = Graphics.FromImage(bmp)
        gr.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height))
    End Using
    Return bmp
End Function

ImgResult = New Bitmap(Original)
        For j = 0 To Original.Height - 1
            For i = 0 To Original.Width - 1
                ImgResult.SetPixel(i, j, Color.FromArgb(resultArray2(j, i, 0), originalArray(j, i, 1), resultArray2(j, i, 2)))
            Next
        Next

Dim clone As Bitmap
            clone = ConvertTo24bpp(ImgResult)
            clone.Save(dlgSavePicture.FileName)

输出是 24 位 512x512 bmp 图像,但它的大小是 ~640 KB 而不是 ~678 KB

我认为输出是带有 bmp 扩展名的 png 格式

我的代码错了吗?

于 2015-08-09T13:05:02.313 回答