问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#怎么修改图片的大小和分辨率

发布网友 发布时间:2022-04-27 09:13

我来回答

1个回答

热心网友 时间:2023-09-17 09:33

只是改变图像大小很容易 但是控制文件大小就麻烦了。
同一张图像 确定的编码格式 文件大小也是固定的 根本没法控制。
大概只能*保存为jpeg格式了。
试着给你写了一段代码 不知道是否满足要求 仅供测试...

bool ChangeImageSize(string imgPath, int width, long maxFileSize)
{
var bmp = (Bitmap)Image.FromFile(imgPath);
Size s = new Size(width, width * bmp.Height / bmp.Width);
var newBmp = new Bitmap(bmp, s);
var ms = TrySaveJpeg(newBmp, maxFileSize);
newBmp.Dispose();
bmp.Dispose();

if (ms==null) return false;
FileStream fs = new FileStream(imgPath, FileMode.Create);
ms.CopyTo(fs);
fs.Close();
return true;
}

Stream TrySaveJpeg(Bitmap bitmap, long maxByteSize)
{
MemoryStream msOld = new MemoryStream(),
msNew = new MemoryStream();
var codec = ImageCodecInfo.GetImageEncoders()
.FirstOrDefault(c=>c.MimeType=="image/jpeg");
var encParam = new EncoderParameters(1);

encParam.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 0L);
bitmap.Save(msOld, codec, encParam);
if (msOld.Length > maxByteSize){
return null; //最差画质
}
encParam.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
bitmap.Save(msNew, codec, encParam);

if (msNew.Length < maxByteSize){
msNew.Seek(0, SeekOrigin.Begin);
return msNew; //最佳画质
}
//假设文件大小和图像质量成正相关 这里没有具体测试 姑且认为成立
//用二分法找到最合适的图像质量
long start=1, end=99;
while (start<end){
long qua=(start+end)/2;
encParam.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qua);
msNew.SetLength(0);
bitmap.Save(msNew, codec, encParam);
if (msNew.Length==maxByteSize){
msNew.Seek(0, SeekOrigin.Begin);
return msNew;
} else if (msNew.Length>maxByteSize){
end = qua-1;
} else if (msNew.Length<maxByteSize){
start = qua+1;
MemoryStream temp = msNew;
msNew = msOld;
msOld = temp; //保存一个小于指定大小 并且最接近的
}
}
msOld.Seek(0, SeekOrigin.Begin);
return msOld;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
绩效工资从工资里扣合法吗 无人机电机轴的主要功能有哪些? 闽侯南通多久发展 南通哪个位置最有潜力 南通未来的机遇有哪些 江苏南通的发展前景怎么样 南通这座城市未来发展前景怎样 我女儿阳历08年01月08日出生,{农历07年腊月初一}请高人帮忙改个名字... 我女儿是2012年1月10日10:35分出生的五行缺什么,取什么名字好 这种图片效果怎么做出来的,不是纯白板,仔细看有一个个均匀分布的小圆点... 怎样改变照片的大小和分辨率 如何在图片查看器里修改图片分辨率 如何修改图片分辨率大小而使图象不变形? 电子和电荷的关系 电子和电荷的区别初中 电子跟电流有什么关系? 作文400字,题目《春节》 中年男士什么网名好听 男人四十取什么qq名称 四十岁的男人,适应什么样的网名 40来岁的人用什么网名呢 亲帮40岁的男人起个QQ名字 四十岁的男人用什么样的网名 2015男人四十伤感网名最好四字的 怎么关闭荣耀手机的语音助手 适合40岁的网名,男人的,简体字的 爸爸今年四十,挺潮的,想问问大家有没有好听合适的网名,四五个字的。别太俗了,谢谢大家啦! 四十岁的男人取什么网名 四十岁男人适合的网名有哪些 怎么修改图片大小和分辨率 手机怎么投屏给笔记本电脑 有必要给笔记本电脑安一个散热器吗? 怎么用otg转接头存东西。 苹果OTG转接头连接mini2怎么使用? O丅G转接头使用时怎么充电? OPPO手机怎么用otg转接头存东西? 12g的手机有没有普及5G网络? 冬天打底衫高领和半高领哪个卖的好 知道别人的就能接收别人的聊天信息是真的吗? 你们身边年入几百万甚至上千万的都是做什么生意的? 有什么项目能够年入百万? 做什么生意一年可以赚几百万 利润很很高的10个冷门创业项目有哪些? 有什么偏门生意最赚钱 真正偏门投资少利润高年收入百万的好生意有吗 有什么生意能让你一年赚一百万 做什么偏门生意可以一年赚四十万 偏门日挣五百元的生意有哪些? 苹果手机怎么关闭qq电话