.net 使用System.Drawing.Imaging保存webp文件会生成大文件或编码器不存在

vnjpjtjt  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(236)

所以我使用.NET 7,因为System.Drawing.Imaging可以(或似乎是)使用以下代码将文件保存为webp文件:

pictureBox1.Image = image; //image is a Bitmap
           image.Save(folderpath, ImageFormat.Webp);

非常向前,但保存的图像占用716kb,但其大小为640 x 480

如何减小文件大小?

我找到了很多关于减少图像大小的答案,但不是我的情况,已经减少了,我想知道为什么一个webp文件会这么大,因为质量也很差(网络摄像头图像)。
使用PNG会占用磁盘上相同的空间。
更新:
因此,我可以使用MSDN中的以下代码来降低PNG的“质量”:

if (capture.IsOpened())
            {
                capture.Read(frame);
                image = BitmapConverter.ToBitmap(frame);
                if (pictureBox1.Image != null)
                {
                    pictureBox1.Image.Dispose();
                }
                pictureBox1.Image = image;


                ImageCodecInfo myImageCodecInfo;
                System.Drawing.Imaging.Encoder myEncoder;
                EncoderParameter myEncoderParameter;
                EncoderParameters myEncoderParameters;

                myImageCodecInfo = GetEncoder("image/webp");

                myEncoderParameters = new EncoderParameters(1);
                myEncoder = System.Drawing.Imaging.Encoder.Quality;
                // Save the bitmap as a JPEG file with quality level 25.
                myEncoderParameter = new EncoderParameter(myEncoder, 25L);
                myEncoderParameters.Param[0] = myEncoderParameter;
                // and now save it to the file

                image.Save(filename, myImageCodecInfo, myEncoderParameters); 

            }

使用这种方法:

public static ImageCodecInfo GetEncoder(string mimetype)
    {
        return ImageCodecInfo.GetImageEncoders().FirstOrDefault(e => e.MimeType == mimetype);
    }

但是我不明白为什么如果Save()允许我保存为webp文件,在ImageCodecInfo.GetImageEncoders()中没有编码器来mimetype webp

fdbelqdn

fdbelqdn1#

它占用与PNG相同的空间的原因很简单:在保存()函数的源代码中,您可以看到,如果它找不到所请求格式的编码器,它会默认为PNG。
我相信尽管库中有ImageFormat.Webp常量,但Windows并不提供WebP编码器。documentation for GDI+没有列出WebP,当我在Windows 10系统上列出编码器时,它也与该列表匹配。因此,如果你想保存到WebP,你需要使用第三方库。
例如,您可以像这样使用SkiaSharp.Views.Desktop.Common包:

using var skImage = image.ToSKImage();
using var skData = skImage.Encode(SkiaSharp.SKEncodedImageFormat.Webp, 90);
using var file = File.OpenWrite(filename);
skData.SaveTo(file);

相关问题