C#简单图像resize:文件大小不缩小

我对以下代码有疑问。 我下面的代码成功运行一个目录,并将图片的resoultion设置为较小的大小。 但是,文件大小不会更改。 例如,尺寸为2400×1800且文件大小为1.5MB的图像将缩放为800×600,但800×600图片仍为1.5MB文件大小。 我想我可能要明确压缩图片,但我不确定。 有任何想法吗?

private void Form1_Load(object sender, EventArgs e) { string[] files = null; int count = 0; files = System.IO.Directory.GetFiles(@"C:\Users\..\..\ChristmasPicsResized"); foreach (string file in files) { System.Drawing.Bitmap bmp = System.Drawing.Bipmap.FromFile(file); ResizeBitmap(bmp, 807, 605).Save( @"C:\users\..\..\TempPicHold\Pic" + count.ToString() + ".jpg"); count++; } } public Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight) { Bitmap result = new Bitmap(nWidth, nHeight); using (Graphics g = Graphics.FromImage((Image)result)) g.DrawImage(b, 0, 0, nWidth, nHeight); return result; } 

发现了问题。 感谢@yetapb显示更清晰的代码版本,但仍然无效。 问题的答案是我需要明确指定将图像保存为的文件类型的类型。 我的猜测是因为我没有明确指定图像格式,因此没有相应地处理图像压缩。一个Bitmap刚刚以较小的分辨率保存,并且“.jpg”被打到它上面,并且没有相应地压缩。 以下代码现在有效。

  files = System.IO.Directory.GetFiles(@"C:\PicFolder"); for (string file in files) { Bitmap tempBmp = new Bitmap(file); Bitmap bmp = new Bitmap(tempBmp, 807, 605); bmp.Save( @"C:\NewPicFolder\Pic" + count + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); count++; } 

不确定位图,但对于其他图像,您可以指定不同的压缩编码器。 这里有 MSDN详细信息

您需要在Graphics对象上设置一些属性以更改图像的质量。

 graphics.CompositingQuality = CompositingQuality.HighSpeed; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.CompositingMode = CompositingMode.SourceCopy; graphics.DrawImage(photo, 0, 0, width, height); 

您还可以在保存文件时设置不同的压缩编码,或以其他格式保存。

有趣的实现细节:将图像翻转两次,这将导致缩略图被抛出,这将减小文件大小。

result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);

进行了一些更改,以下代码按预期减少了文件大小(对我而言)。

 private void Form1_Load(object sender, EventArgs e) { string[] files = null; int count = 0; files = System.IO.Directory.GetFiles(@"C:\Users\..\..\ChristmasPicsResized"); foreach (string file in files) { Bitmap bmp = new Bitmap( file ); new Bitmap( bmp, 807, 605 ).Save( @"C:\users\..\..\TempPicHold\Pic" + count.ToString() + ".jpg"); count++; } } 

}

  private void button4_Click(object sender, EventArgs e) { String[] files; int count = 0; files = System.IO.Directory.GetFiles(@"C:/dataset"); foreach (string file in files) { Bitmap tempBmp = new Bitmap(file); Bitmap bmp = new Bitmap(tempBmp, 200, 200); bmp.Save( @"C:/Newdataset1/" + count + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); count++; } 

}