我想将图像重新调整为特定的150 * 150尺寸,图像尺寸应小于或等于10kb。我已经完成了Bitmap,代码片段如下:
System.Drawing.Image old_Image=System.Drawing.Image.FromFile(//ImagePath);
Bitmap new_Image= new Bitmap(150, 150, PixelFormat.Format24bppRgb);
Graphics g=new Graphics();
g= Graphics.FromImage(new_Image);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawImage(old_Image, new Rectangle(new Point(0, 0), new_Image));
当我这样做时,我得到了尺寸为150 * 150且尺寸小于10kb的所有图像。但是,对于每个原始尺寸较大的图像,我如何确保图像尺寸每次都小于10kb。我可以通过在代码端检查来确定它吗?或者还有其他方法吗?
更新: 我已压缩图像,只要图像大小小于10kb,就需要执行相同的操作。第一次迭代循环工作正常,第二次调用b.Save(ms,ici,ep)时出现“参数无效”错误。我在第一次迭代后调用了Bitmap和MemoryStream。那可能是造成这个错误的原因。 我用于迭代的代码片段如下:
while (length > 10240)
{
long quality = 50;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType == "image/jpeg")
ici = codec;
}
EncoderParameters ep = new EncoderParameters();
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
ms = new MemoryStream();
b.Save(ms, ici, ep);
using (Bitmap bp = new Bitmap(ms))
{
b = bp;
}
length = Convert.ToInt32(ms.Length);
ms.Dispose();
}
答案 0 :(得分:0)
您可以像这样得到图像的输出尺寸:
using (var testStream = new MemoryStream())
{
b.Save(testStream, ImageFormat.Jpeg);
long streamSize = testStream.Length;
}
b 是您的形象。
如果您想要进一步压缩它以减小图像的大小,请尝试以下方法:
//quality of the compressed image
long quality = 50;
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType == "image/jpeg")
ici = codec;
}
EncoderParameters ep = new EncoderParameters();
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
using (var testStream = new MemoryStream())
{
b.Save(testStream, ici, ep);
long streamSize = testStream.Length;
}
我们正如上所述,但我们现在有可能降低jpeg压缩的质量。