2009-12-15 8 views
1

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

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

Найдено проблему. Спасибо @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

Кроме того, ознакомьтесь с [ошибками изменения размера изображения] (http://nathanaeljones.com/163/20-image-resizing-pitfalls/), которых вам следует избегать. Прямо сейчас вы пропускаете дескрипторы GDI, память и создаете некачественные изображения. –

+0

На самом деле, почему бы не использовать библиотеку, которая позволяет избежать ошибок, с которыми вы столкнулись GDI? Библиотека http://imageresizing.net бесплатна, с открытым исходным кодом, поддерживается и хорошо документирована. И он имеет 1-строчный API, который занимает около секунды, чтобы понять. –

2

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

2

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

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

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

+0

также: 'graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; ' – vapcguy

0

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

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

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

}

+0

Итак, вместо того, чтобы делать' System.Drawing.Bitmap bmp = System.Drawing.Bipmap.FromFile (файл); ', вы создаете новый битмап? Тем не менее, эта версия также по-прежнему имеет проблемы с ударом '.jpg' в конце растрового файла. OP, похоже, хотел конвертировать, а не просто переименовывать как '.jpg. – vapcguy

+0

Глядя на то, что я написал и что написал OP (6 лет назад!), Я вижу, что я только что отредактировал его код до такой степени, что он уменьшил размеры файлов (для меня). Его вопрос никогда явно не заявляет о желании преобразовать в jpeg, но его ответ на его собственный вопрос. –

1
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

Объяснение логики было бы неплохо. –

 Смежные вопросы

  • Нет связанных вопросов^_^