C # Простое изменение размера изображения: размер файла не уменьшается - PullRequest
2 голосов
/ 15 декабря 2009

У меня вопрос по поводу кода ниже. Приведенный ниже код успешно проходит через каталог и устанавливает разрешение для уменьшения размера изображения. Однако размер файла не изменяется. Например, изображение размером 2400x1800 с размером файла 1,5 МБ будет масштабировано до 800x600, но изображение размером 800x600 по-прежнему будет иметь размер файла 1,5 МБ. Я думаю, что мне, возможно, придется явно сжать картинку, но я не уверен. Есть идеи?

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;
        }

Ответы [ 6 ]

8 голосов
/ 16 декабря 2009

Нашел проблему. Спасибо @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++;
            }
2 голосов
/ 15 декабря 2009

Вам нужно установить некоторые свойства объекта Graphics, чтобы изменить качество изображения.

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

Вы также можете установить различные кодировки сжатия при сохранении файла или в другом формате.

2 голосов
/ 15 декабря 2009

Не уверен насчет растровых изображений, но для других изображений вы можете указать другой кодер сжатия. Подробности MSDN здесь

0 голосов
/ 05 июля 2013
 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++;
            }  

}

0 голосов
/ 15 декабря 2009

Внесла пару изменений, следующий код уменьшил размеры файлов, как и ожидалось (для меня).

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++;   
    }
}

}

0 голосов
/ 15 декабря 2009

Интересная деталь реализации: дважды переверните изображение, и это приведет к выбрасыванию эскиза, что уменьшит размер файла.

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

...