C#怎么修改图片的大小和分辨率
1个回答
展开全部
只是改变图像大小很容易 但是控制文件大小就麻烦了。
同一张图像 确定的编码格式 文件大小也是固定的 根本没法控制。
大概只能限制保存为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;
}
同一张图像 确定的编码格式 文件大小也是固定的 根本没法控制。
大概只能限制保存为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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询