3

我对下面的代码有疑问。我下面的代码成功地运行了一个目录,并将图片的分辨率设置为更小的尺寸。但是,文件大小不会改变。例如,尺寸为 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;
        }
4

6 回答 6

8

发现了问题。感谢@yetapb 展示了更简洁的代码版本,但这仍然不起作用。问题的答案是我需要明确指定图像将保存为的文件类型。我的猜测是,因为我没有明确指定图像格式,所以没有相应地处理图像压缩。位图只是以较小的分辨率保存,并在其上加上“.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++;
            }
于 2009-12-16T06:20:04.993 回答
2

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

于 2009-12-15T18:58:18.293 回答
2

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

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

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

于 2009-12-15T18:59:13.690 回答
0

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

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

于 2009-12-15T19:06:21.037 回答
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++;   
    }
}

}

于 2009-12-15T19:18:28.113 回答
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++;
            }  

}

于 2013-07-05T08:44:06.200 回答