我继承了一个在宽度和高度上调整图像大小的代码。 我还观察到,即使图像高度和宽度增加,它也会减小文件大小。 这是保存图像的调整大小代码和调用功能代码
例如哪个可能更好解释。我的原始图像为709 * 653像素,文件大小为670 kb
调整大小后,预期为1000 * 921,但其大小为176 kb
Image orgImage = Image.FromFile(originalimagepath);
//resizes image using below function
transformedImage = ImageUtils.resizeImage(orgImage, Settings.MaxLargeImage);
memstrImage = new MemoryStream();
//saves image to memorystream which is in turn saved in destination as resized image.
transformedImage.Save(memstrImage,ImageFormat.Jpeg);
public static Image resizeImage(Image imgToResize, int resizeType)
{
//resizetype is maximum resize width I want image to take.
int height = imgToResize.Height;
int width = imgToResize.Width;
float ratio = 0;
Size size = new Size();
if (height >= width)
{
ratio = ((float)resizeType / (float)height);
}
else
{
ratio = ((float)resizeType / (float)width);
}
size.Height = Convert.ToInt32((float)ratio * (float)imgToResize.Height);
size.Width = Convert.ToInt32((float)ratio * (float)imgToResize.Width);
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destHeight = Convert.ToInt32(sourceHeight * nPercent);
int destWidth = Convert.ToInt32(sourceWidth * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage((Image)b);
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
return (Image)b;
}
我假设,并且可以看到宽高比没有受到影响但建议保持原样,或者当图像高度和宽度增加时,理想情况下文件大小应该增加是否合乎逻辑
对于这个问题,我希望在高度和宽度增加时增加文件大小,但欢迎提供最佳实践建议。
有什么建议吗?
答案 0 :(得分:0)
这显然是以不同的图像格式保存(bmp或png vs jpg)或使用不同的JPG压缩强度。
加载图像时应注意图像的格式,并以相同的格式保存。或者在保存jpg时确保使用不同的抗压强度。查看更多here。
答案 1 :(得分:0)
您将调整后的图片保存为Jpeg格式。 Jpeg是一种"lossy"格式,这意味着,为了节省空间,保存的图像只是内存中位图的近似值,选择它使它看起来&#34;关闭&#34;原来是人眼。如果您只是使用Image.Save()
来保存您的位图,那么&#34;存储质量&#34;根据这篇文章,据信是75岁。What quality level does Image.Save() use for jpeg files?。 (无论如何,没有记录Jpeg格式Image.Save()
的质量。)
因此,如果您调整位图大小并将其保存到Jpeg,由于压缩,生成的文件可能比原始文件小或更大,而与维度的更改无关。 (尽管大维度的变化最终会主导任何压缩问题,因为位图的原始大小会随着缩放像素尺寸而呈二次方增长。)
如果您想在保存JPG时试验质量设置如何影响文件大小,可以使用此方法:
public static void SaveJpegWithSpecifiedQuality(this Image image, string filename, int quality)
{
// http://msdn.microsoft.com/en-us/library/ms533844%28v=vs.85%29.aspx
// A quality level of 0 corresponds to the greatest compression, and a quality level of 100 corresponds to the least compression.
if (quality < 0 || quality > 100)
{
throw new ArgumentOutOfRangeException("quality");
}
System.Drawing.Imaging.Encoder qualityEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters encoderParams = new EncoderParameters(1);
EncoderParameter encoderParam = new EncoderParameter(qualityEncoder, (long)quality);
encoderParams.Param[0] = encoderParam;
image.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParams);
}
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}