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

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

非常靠前,但保存的图像占716kb,但其大小为640x480

How can I reduce the file size?

I found a lot of answers about reduce the image size, but is not my case, already reduced, and I'm wonder why a webp file will be so big, because the quality also is very poor (webcam image).
Using the PNG format ocuppies the same space on disk.

最新情况:

因此,我可以使用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()中没有编码器来MIME TYPE WebP

推荐答案

它占用与PNG相同的空间的原因很简单:它可能会生成一个PNG.在the source code for the save() function中,您可以看到,如果它找不到所请求格式的编码器,则默认为PNG.

我相信尽管这个库有ImageFormat.Webp常量,但Windows没有提供WebP编码器.documentation for GDI+没有列出WebP,当我列出Windows10系统上的编码器时,它也与该列表匹配. 因此,如果您想要保存到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);

Csharp相关问答推荐

EF Core在请求列表时忽略列,但在按ID获取时包含

使用LINQ to XML获取元素值列表是不起作用的

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

.NET 8 Web-API返回空列表

Blazor服务器端的身份验证角色

Mongo作为.NET中Testcontainers的副本集

使用Orleans进行的单元测试找不到接口的实现

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

如何使用.NET6WPF打印车票?

当试图限制EF Select 的列时,如何避免重复代码?

避免只读记录 struct 中的防御副本

在C#中过滤Excel文件

Google OAuth令牌交换在.Net中不起作用

在扩展方法中,IEnumerable<;T>;不会转换为IEumerable<;T&>

{ or ; expected error如何解决此问题

EF Core:如何对关系属性进行建模?

RCL在毛伊岛应用程序和Blazor服务器应用程序.Net 8.0中使用页面

忽略Visual Studio代码中的StyleCop规则

C#-如何将int引用获取到byte[]

如何在C#中用Serilog记录类路径、方法名和行编号