我对以下代码有疑问。我下面的代码成功运行了一个目录,并将图片的resoultion设置为更小的尺寸。但是,文件大小不会更改。例如,尺寸为2400x1800且文件大小为1.5MB的图像将缩放为800x600,但800x600图片仍为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;
}
答案 0 :(得分:8)
发现问题。感谢@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++;
}
答案 1 :(得分:2)
不确定位图,但对于其他图像,您可以指定不同的压缩编码器。 MSDN详细信息here
答案 2 :(得分:2)
您需要在Graphics对象上设置一些属性以更改图像的质量。
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.DrawImage(photo, 0, 0, width, height);
您还可以在保存文件时设置不同的压缩编码,或以其他格式保存。
答案 3 :(得分:0)
有趣的实现细节:将图像翻转两次,这将导致缩略图被丢弃,这将减小文件大小。
result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
result.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
答案 4 :(得分:0)
进行了一些更改,以下代码按预期减少了文件大小(对我而言)。
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++;
}
}
}
答案 5 :(得分:0)
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++;
}
}