Bitmpa.Save & GZipStream - ошибка
От: Holms США  
Дата: 07.12.08 20:47
Оценка:
Привет

есть такой код

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.IO.Compression;
using System.Windows.Forms;

namespace TestImageTypeSize
{
  class Program
  {
    static void Main()
    {
      ImageFormat[ ] formats = new[ ] { ImageFormat.Gif, ImageFormat.Jpeg, ImageFormat.Png };

      int screenId = 0;
      foreach (Screen screen in Screen.AllScreens)
      {
        Bitmap bmp = new Bitmap(screen.Bounds.Width, screen.Bounds.Height);
        Graphics g = Graphics.FromImage(bmp);

        g.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, new Size(screen.Bounds.Width, screen.Bounds.Height));

        foreach (ImageFormat format in formats)
        {
          string filename = @"t:\screen_" + screenId + "." + format;

          bmp.Save(filename, format);

          FileStream fileStream = new FileStream(filename + ".zip", FileMode.Create, FileAccess.ReadWrite);
          GZipStream gZipStream = new GZipStream(fileStream, CompressionMode.Compress);
          bmp.Save(gZipStream, format);
          gZipStream.Close();
        }

        screenId++;
      }
    }
  }
}


который падает в строке
bmp.Save(gZipStream, format);

с ошибкой
A generic error occurred in GDI+


используется VS2008 Team Ed, .NET 3.5 Sp1 на Win XP SP3

в чем ошибка?

Спасибо
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>

12.12.08 20:10: Перенесено модератором из 'MFC' — Кодт
The life is relative and reversible.
Re: Bitmpa.Save & GZipStream - ошибка
От: samius Япония http://sams-tricks.blogspot.com
Дата: 12.12.08 21:35
Оценка: 6 (1)
Здравствуйте, Holms, Вы писали:

H>в чем ошибка?


Ошибки нет. Лажает код сохранения битмапа. Падает при Bmp и Png. Gif и Jpeg сохраняет нормально.
Избавиться от глюка можно сохраняя битмап в "прямой" стрим (файловый, или MemoryStream).

З.Ы. не забывайте явно освобождать ресурсы (Bitmap и Graphics)
Re: Bitmpa.Save & GZipStream - ошибка
От: Аноним  
Дата: 13.12.08 00:11
Оценка:
H>          FileStream fileStream = new FileStream(filename + ".zip", FileMode.Create, FileAccess.ReadWrite);
H>          GZipStream gZipStream = new GZipStream(fileStream, CompressionMode.Compress);
H>          bmp.Save(gZipStream, format);
H>          gZipStream.Close();
H>


Может это и правда баг gdi+, а может и GZipStream.

Попробуйте сначала в memoryStream сохранять bmp, а затем в gZip и в файл.
Bitmap.Save & GZipStream - ошибка
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.12.08 07:46
Оценка: 63 (3)
#Имя: FAQ.dotnet.cdg+streams
Здравствуйте, Holms, Вы писали:

H>Привет


H>есть такой код

H>в чем ошибка?
Не то чтобы ошибка... GDI+ накладывает достаточно жесткие требования на используемые для чтения или записи потоки. Это такая особенность, о которой не любят писать в документации.
Поэтому правило большого пальца выглядит так: "никогда не используйте "настоящий" поток для чтения или записи изображений. Всегда используйте для этого промежуточный MemoryStream".
Это правило, конечно, можно нарушать, но только в тех немногих случаях, когда вы точно понимаете, что происходит.
(Вкратце: в данном случае всё падает потому, что GZipStream не поддерживает перемотку обратно).
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.