(c#)更改图片大小和分辨率

图片的路径已知imgPath,通过点击“转换”按钮,实现将该图片另存为宽width=100,高按比例伸缩,图片大小限制在size=30k以内。希望大神帮个忙,做成一个类,... 图片的路径已知 imgPath ,通过点击“转换”按钮,实现将该图片另存为宽width=100,高按比例伸缩,图片大小限制在size=30k以内。
希望大神帮个忙,做成一个类,用参数imgPath、width、size
展开
 我来答
百度网友cfe4d0f
推荐于2017-09-08 · TA获得超过1502个赞
知道小有建树答主
回答量:937
采纳率:100%
帮助的人:849万
展开全部

只是改变图像大小很容易 但是控制文件大小就麻烦了

同一张图像 确定的编码格式 文件大小也是固定的 根本没法控制啊- -


大概只能限制保存为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;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式