当前位置: 首页 > 编程语言 > C#

使用图像类共享在C#中丢失图像质量(减少颜色数量)

时间:2023-04-10 10:45:48 C#

在使用图像类的C#中丢失图像质量(减少颜色数量)我有一个打开.tif图像的C#程序,该选项保存它是后来提供的。但是,保存图像时总会有质量损失。(编辑:我在保存图像时传递了一些参数以使质量为100%并且没有压缩,但实际唯一颜色的数量从254变为16,即使图像属性显示8bpp)(编辑2:有问题的图像是每像素8位灰度图像-256种颜色/灰度阴影-我测试的每像素24位彩色图像不会发生这种情况,所有颜色都保留在这里。我开始认为图像类可能只支持16种灰度我该如何避免这种情况?下面是打开图像的代码:publicImageimageImport(){StreammyStream=null;OpenFileDialogopenTifDialog=newOpenFileDialog();openTifDialog.Title="打开想要的图片";openTifDialog.InitialDirectory=@"c:";openTifDialog.Filter="仅Tiff(*.tif)|*.tif";openTifDialog.FilterIndex=1;openTifDialog.RestoreDirectory=true;如果(openTifDialog.ShowDialog()==DialogResult.OK){尝试{如果((myStream=openTifDialog.OpenFile())!=null){使用(myStream){字符串tifFileName=openTifDialog.FileName;imgLocation=tif文件名;位图tifFile=newBitmap(tifFileName);返回tif文件;}}}catch(Exceptionex){MessageBox.Show("错误:无法从磁盘读取文件。原始错误:"+ex.Message);}}返回空值;这就是我保存图像的方式:privatevoidsaveImage(Imageimg){SaveFileDialogsf=newSaveFileDialog();sf.Title="选择文件位置";sf.Filter="bmp(*.bmp)|*.bmp|jpeg(*.jpg)|*.jpg|tiff(*.tif)|*.tif";旧金山。筛选索引=4;sf.RestoreDirectory=true;sf.ShowDialog();//如果文件名不是空字符串,打开它保存。if(sf.FileName!=""){//通过OpenFile方法创建的FileStream保存图像。System.IO.FileStreamfs=(System.IO.FileStream)sf.OpenFile();//根据在对话框中选择的//文件类型以适当的ImageFormat保存图像。//注意FilterIndex属性是从一开始的。switch(sf.FilterIndex){案例1:img.Save(fs,System.Drawing.Imaging.ImageFormat.Bmp);休息;情况2:img.Save(fs,System.Drawing.Imaging.ImageFormat.Jpeg);休息;案例3://EDITED-仍然不能解决问题ImageCodecInfocodecInfo=ImageClass.GetEncoderInfo(ImageFormat.Tiff);EncoderParameters参数=newEncoderParameters(2);parameters.Param[0]=newEncoderParameter(System.Drawing.Imaging.Encoder.Quality,100L);parameters.Param[1]=newEncoderParameter(System.Drawing.Imaging.Encoder.Compression,(long)EncoderValue.CompressionNone);img.Save(fs,codecInfo,参数);休息;}fs.Close();即使我没有以任何方式调整图像大小或改变图像,我也会遇到质量损失有什么建议吗?System.Drawing对8位图像的支持很差。从24位或32位图像转换为8位图像时;它总是使用固定的默认调色板。此默认调色板仅包含16种灰色阴影,其他条目是各种颜色。保存为“.bmp”时是否有同样的问题?如果是,那么到8位格式的转换很早就发生了,您必须弄清楚您的程序在哪里进行并解决问题。如果只有tiff编码器转换为8位,则必须先在单独的步骤中进行8位转换。创建一个8位图像,用灰度调色板填充Image.Palette,然后复制位图数据。但是System.Drawing对8位图像的支持很差,一些方法(例如SetPixel)在处理这些图像时只会抛出InvalidOperationException。您可能必须使用不安全的代码(使用LockBits等)来复制位图数据。如果我是你,我会看看你是否有可以使用的替代图形库。我在使用.NET库找到图像质量和大小之间的良好平衡时遇到了麻烦。我放弃了自己并尝试了一些图像库。我发现http://imageresizing.net/产生的结果始终如一,比我做的更好。如果您自己的方法不能始终如一地为您工作,请将其作为计划B抛出。Image.Save默认使用75%的质量设置。您可以尝试允许您指定质量设置参数的方法的其他重载之一。看到这个问题。真的只有一个建议....加载图像时使用newBitmap(fileName)...而不是使用Bitmap你考虑使用ImagetiffImage=Image.FromFile(tiffFileName,true);true告诉它使用“嵌入式颜色管理”,使用Image而不是Bitmap来避免可能在幕后发生的任何图像投射。以上就是C#学习教程:使用Image类在c#中降低图像质量(减少颜色数量),分享全部内容。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处: