c# 图片压缩 (非图片大小变化)----使得显示效果差点,但是图片占用空间需要变小。

linxisheng 2008-09-29 02:21:27
我贴上我的图片大小转换功能 但是找不到相关的图片压缩的功能,就是使得显示效果差点,但是图片占用空间需要变小。
Bitmap newPic = new Bitmap(fi.FullName);
//CompressScale
newPic.SetResolution(newPic.HorizontalResolution * float.Parse(form1.txtCompressScale.Text) / 100, newPic.VerticalResolution * float.Parse(form1.txtCompressScale.Text) / 100);//本以为这个会起作用,但事实上也不知道干嘛的 呵呵 就是没反应

Bitmap bmp;
bmp = new Bitmap(witdh, height);
Graphics grap;
grap = Graphics.FromImage(bmp);
grap.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
grap.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grap.DrawImage(newPic, new Rectangle(0, 0, witdh, height));//改变大小,绘图的函数就是这个了,但里面貌似也没有压缩的功能
...全文
4004 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouerxiaoqian06 2011-10-08
  • 打赏
  • 举报
回复
看看怎么使用
sigmund86 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qshzf 的回复:]
经过这样处理的 Graphics 再保存,测试下数据大小能不能改变。
[/Quote]

用你的code压缩之后存入DB,取回的时候我还想要回高质量的图片 怎么做,可以吗?
billgorush 2010-10-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 junon 的回复:]
/// <param name="Qty"></param>
怎么填写?
[/Quote]

Quality 类别指定图像的压缩级别。当用于构造 EncoderParameter 时,质量类别有效值的范围是从 0 到 100。指定的数字越小,压缩的级别就越高,因而图像的质量也就越差。值为 0 时,图像的质量最差;值为 100 时,图像的质量最佳。
xiaojia_25445828 2010-02-25
  • 打赏
  • 举报
回复
引11用 12 楼 reallijin 的回11复:
不好意思,本来是引用8楼呢!!!!!!引用 11 楼 reallijin 的回复:gif格式的透明图片,用这个方法就不透明或背景一片黑。这个方法不是很完美。引用 7 楼 qshzf 的回复: 莫非是蔷薇来了?看来你在华南那儿aaa
aa
sfsa
junon 2009-09-22
  • 打赏
  • 举报
回复
/// <param name="Qty"></param>
怎么填写?
reallijin 2009-07-25
  • 打赏
  • 举报
回复
不好意思,本来是引用8楼呢!!!!!![Quote=引用 11 楼 reallijin 的回复:]
gif格式的透明图片,用这个方法就不透明或背景一片黑。这个方法不是很完美。引用 7 楼 qshzf 的回复:
莫非是蔷薇来了?看来你在华南那儿

[/Quote]
reallijin 2009-07-25
  • 打赏
  • 举报
回复
gif格式的透明图片,用这个方法就不透明或背景一片黑。这个方法不是很完美。[Quote=引用 7 楼 qshzf 的回复:]
莫非是蔷薇来了?看来你在华南那儿
[/Quote]
name_zzxc 2009-04-27
  • 打赏
  • 举报
回复
为什么执行到
bmp.Save(FileName, GetCodecInfo("image/jpeg"), ps);

出现错误
linxisheng 2008-09-29
  • 打赏
  • 举报
回复
你真的太牛逼了,非常好用。
thankyou 灰常Much。
qshzf 2008-09-29
  • 打赏
  • 举报
回复
C#图片处理之: 另存为压缩质量可自己控制的JPEG


处理图片时常用的过程是:读入图片文件并转化为Bitmap -> 处理此Bitmap的每个点以得到需要的效果 -> 保存新的Bitmap到文件
使用C#很方便的就可以把多种格式的图片文件读到Bitmap对象中。一句话就够了,常见的格式都支持,诸如JPEG,BMP,PNG等等。

Bitmap bmp = new Bitmap("文件名");

然后就是怎么处理这个图片的问题了,与本案无关,pass。

最后就是保存。JPEG虽然是有损压缩方案,但是它在缩减文件体积和尽可能好的保留原有信息的矛盾上很好的找到了平衡点,所以在很多情况下成为首选的保存方案。

C#当然不会无视这一点,Bitmap类提供了默认的另存为JPEG的方法:

bmp.Save("输出文件", System.Drawing.Imaging.ImageFormat.Jpeg);

这样当然很方便,但有时候更在乎文件体积而有时候更在乎图像质量,是不是有什么办法可以让自己来控制压缩质量呢?

答案是肯定的,bmp.Save方法中有个重载用到了EncoderParameters参数。我们可以在这个参数中加入自己的控制质量。
/**//// <summary>
/// 保存JPG时用
/// </summary>
/// <param name="mimeType"></param>
/// <returns>得到指定mimeType的ImageCodecInfo</returns>
private static ImageCodecInfo GetCodecInfo(string mimeType)
{
ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo ici in CodecInfo)
{
if (ici.MimeType == mimeType) return ici;
}
return null;
}


        /**//// <summary>
/// 保存为JPEG格式,支持压缩质量选项
/// </summary>
/// <param name="bmp"></param>
/// <param name="FileName"></param>
/// <param name="Qty"></param>
/// <returns></returns>
public static bool KiSaveAsJPEG(Bitmap bmp, string FileName, int Qty)
{
try
{
EncoderParameter p;
EncoderParameters ps;

ps = new EncoderParameters(1);

p = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, Qty);
ps.Param[0] = p;

bmp.Save(FileName, GetCodecInfo("image/jpeg"), ps);

return true;
}
catch
{
return false;
}

}


qshzf 2008-09-29
  • 打赏
  • 举报
回复
莫非是蔷薇来了?看来你在华南那儿
linxisheng 2008-09-29
  • 打赏
  • 举报
回复
台风快来了,我先跑了。
linxisheng 2008-09-29
  • 打赏
  • 举报
回复
我就加了这两句
grap.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
grap.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
测试了下 大小完全一样





不过就算变了也没不能怎样的,难道这玩意还要自己些算法?oh my god
qshzf 2008-09-29
  • 打赏
  • 举报
回复
经过这样处理的 Graphics 再保存,测试下数据大小能不能改变。
linxisheng 2008-09-29
  • 打赏
  • 举报
回复
2楼的这些属性是不行的,他们是用来设置图片的处理算法而已,没有我想要的按压缩比例来设置相应的值的。
qshzf 2008-09-29
  • 打赏
  • 举报
回复



Graphics 图象设备 = Graphics.FromImage(参数_图象);

//消除锯齿
图象设备.SmoothingMode = SmoothingMode.AntiAlias;
//设置高质量插值法
图象设备.InterpolationMode = InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
图象设备.SmoothingMode = SmoothingMode.HighQuality;

//参考下 不知道保存成文件能用作用否

qshzf 2008-09-29
  • 打赏
  • 举报
回复
好卡。。
先顶一下

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧