Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-如何更改PNG质量或颜色深度_C#_Image_Png_Image Manipulation_Save - Fatal编程技术网

C#-如何更改PNG质量或颜色深度

C#-如何更改PNG质量或颜色深度,c#,image,png,image-manipulation,save,C#,Image,Png,Image Manipulation,Save,我应该写一个程序,从用户那里获取一些PNG图像,做一些简单的编辑,比如旋转,并将它们保存在一个JAR文件中,这样它就可以使用这些图像作为资源。问题是,当我打开一个80kb的图像,然后用C#保存它时,我会得到一个质量相同的图像,但空间为130kb。因为它必须放在J2MEJAR文件中,所以我需要更小的大小,至少是原始大小。我尝试了下面的代码,但后来发现它只适用于Jpeg图像 ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

我应该写一个程序,从用户那里获取一些PNG图像,做一些简单的编辑,比如旋转,并将它们保存在一个JAR文件中,这样它就可以使用这些图像作为资源。问题是,当我打开一个80kb的图像,然后用C#保存它时,我会得到一个质量相同的图像,但空间为130kb。因为它必须放在J2MEJAR文件中,所以我需要更小的大小,至少是原始大小。我尝试了下面的代码,但后来发现它只适用于Jpeg图像

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                int j = 0;
                for (j = 0; j < codecs.Length; j++)
                {
                    if (codecs[j].MimeType == "image/png") break;
                }
                EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
                EncoderParameters CodecParams = new EncoderParameters(1);
                CodecParams.Param[0] = ratio;

                Image im;
                im = pictureBox1.Image;
                im.Save(address , codecs[j], CodecParams);
这就是它被保存回来的地方,没有任何编辑:

private void generateToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {

                ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                int j = 0;
                for (j = 0; j < codecs.Length; j++)
                {
                    if (codecs[j].MimeType == "image/png") break;
                }
                EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
                EncoderParameters CodecParams = new EncoderParameters(1);
                CodecParams.Param[0] = ratio;

                string address = folderBrowserDialog1.SelectedPath;
                address = address + "\\";
                address.Replace("\\", "\\\\");

                Image im;
                im = pictureBox1.Image;               
                im.Save(address + imageFileNames[1], codecs[j], CodecParams);
private void generateToolStripMenuItem\u单击(对象发送方,事件参数e)
{
如果(folderBrowserDialog1.ShowDialog()==DialogResult.OK)
{
ImageCodecInfo[]codecs=ImageCodecInfo.GetImageEncoders();
int j=0;
对于(j=0;j
注意:imageFileNames[]只是一个字符串数组,其中包含一些必须保存图像的文件名


任何想法都将受到赞赏并提前感谢。

我已拍摄了4个不同的PNG,大小从2KB到2.6MB不等。使用您的代码,我将加载并保存它们。我不会通过旋转或翻转来修改图像。重新保存时,所有4个PNG的大小完全相同

此外,我还拍摄了2.6MB的PNG,在Photoshop中打开并保存了两份,一份是隔行扫描的(减少到2.06MB),一份是非隔行扫描的(减少到1.7MB)。然后我分别拍摄了其中的每一份,在代码中运行并保存了它们。两份文件的大小都恢复到了原来的2.6MB

所以,我猜原始图像是用一个软件(比如photoshop)创建的,该软件有一个优化的压缩算法,它用于PNG规范,而.NET没有使用


我把编码器参数弄得乱七八糟,用于压缩,但它似乎没有任何影响。

很抱歉提出了一个老问题,但我今天解决了同样的问题,在MSDN上找到了此页面:。我希望在那里参考它可能有用

本文包含一个示例程序,该程序输出股票GDI+图像编码器支持的
EncoderParameter
s,PNG编码器不支持任何参数

我不确定人们是否会认为这是理所当然的,或者在未来版本的
gdiplus.dll
中,PNG编码器可能会获得更多支持,因此应该在运行时检查编码器的功能


在任何情况下,对源图像应用一些显式转换似乎是更有效的方法;不过我还没有对此进行探讨。

在不进行编辑的情况下重新保存图像时,是否会更改文件大小?我们可以看到加载图像的代码和保存图像的代码吗?我的(简单)示例中没有看到类似的行为test.Yeb,我更新了帖子并添加了完整的代码。谢谢你的关注。Yeb,你的权利。这些图像是由3dsMax jsr导出器导出的。但是你知道压缩PNG或降低其质量的方法吗,这样我就可以得到与导出器类似的结果吗?这看起来很有希望:…它从这一页包装了这个PNG:谢谢r你的时间,我想你给了我答案。所以,基本上,答案是,不是C增加了大小,是其他应用程序似乎有优化技巧来减少它?在.Net中也会很方便…为什么GDI+没有PNG的质量设置?我想我必须使用Jpeg。:-/@NickGotch,就像
PNG
一样作为一种无损格式,它不能有“质量设置”——从某种意义上说,它的质量总是100%。GDI+编码器似乎缺少一个控制编码速度/压缩比权衡的旋钮。@kostix该列表中的“image/tiff”项有一个“compression”项。>editprivate void generateToolStripMenuItem_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); int j = 0; for (j = 0; j < codecs.Length; j++) { if (codecs[j].MimeType == "image/png") break; } EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L); EncoderParameters CodecParams = new EncoderParameters(1); CodecParams.Param[0] = ratio; string address = folderBrowserDialog1.SelectedPath; address = address + "\\"; address.Replace("\\", "\\\\"); Image im; im = pictureBox1.Image; im.Save(address + imageFileNames[1], codecs[j], CodecParams);