2009-08-28 2 views
3

У нас есть фрагмент кода, который сохраняет файл .Net System.Drawing.Bitmap в файл. Сохранить вызов указать местоположение файла, а также ImageFormat, которые мы ожидаем, чтобы сохранить данные изображения в Jpeg так из кода выглядит следующим образом:Bitmap Сохранить в .Net сохраняет изображение в неправильном формате?

public MediaFile IngestImage(System.Drawing.Bitmap imgSrc, string name){ 
    ... // left out because it is not relevant to this question 
    imgSrc.Save(fullPath, System.Drawing.Imaging.ImageFormat.Jpeg); 
    ... // left out because it is not relevant to this question 
} 

По какой-то причине, то и этот метод генерирует PNG изображений как .jpg файлов. В большинстве случаев это не большая проблема, однако в другой части проекта возникают проблемы с тем, что эти файлы не являются фактическими jpeg (службами Windows Media).

Любая помощь приветствуется, кто-нибудь когда-либо видел это?

Примечание: полный путь - это что-то вроде «\ servcer \ share \ file.jpg». Мы сохраняем jpg с расширением «jpg». Следовательно, проблема ... Позже мы создаем точки публикации на Windows Media Server для воспроизведения плейлиста SMIL, после чего мы должны «Объявлять» файлы и форматы в точке публикации, когда точка публикации начинает воспроизводить ее, ожидает, что файл Jpg будет является расширение файла и содержание фактически PNG

Вот фактический код создания объекта BitpMap, который передается в указанный выше метод ...

 public static Bitmap CreateBitmap(string text, int height, int width, Color foregroundColor, Color backgroundColor, string fontName, int fontSize, bool antialias) 
    { 
     // Initialize graphics 
     Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); 
     using (Graphics g = Graphics.FromImage(bmp)) 
     { 
      g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
      //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      if (antialias) 
      { 
       g.SmoothingMode = SmoothingMode.AntiAlias; 
       g.TextRenderingHint = TextRenderingHint.AntiAlias; 
      } 

      // Set colors 
      SolidBrush fgBrush = new SolidBrush(foregroundColor); 
      SolidBrush bgBrush = new SolidBrush(backgroundColor); 

      // paint background 
      RectangleF rectF = new RectangleF(0, 0, width, height); 
      g.FillRectangle(bgBrush, rectF); 

      // Load font 
      FontFamily fontFamily = FontFamily.GenericSerif; 
      Font font = new Font(fontFamily, fontSize, FontStyle.Regular, GraphicsUnit.Pixel); 
      try 
      { 
       fontFamily = new FontFamily(fontName); 
       font = new Font(fontFamily, fontSize, FontStyle.Regular, GraphicsUnit.Pixel); 
      } 
      catch { } 

      // Set font direction & alignment 
      StringFormat format = new StringFormat(); 
      format.Alignment = StringAlignment.Center; 
      format.LineAlignment = StringAlignment.Center; 

      // Finally, draw the text 
      g.DrawString(text, font, fgBrush, rectF, format); 

      return bmp; 
     } 
    } 
+0

Можете вставить еще немного кода? Я думаю, что проблема заключается либо в методе, который вызывает CreateBitmap, либо в методе IngestImage. – Badaro

+1

проблема не в коде, который вы отправили. Если вы можете опубликовать один класс, который компилируется в одиночку и может воспроизводить поведение, я снова посмотрю ... Есть несколько путей, которые выглядят странно при просмотре класса Image в отражателе (например, кэширование необработанный формат изображения и некоторые хаки, так что в некоторых случаях необработанный формат переключается с jpeg на png), но ни один из них не может объяснить проблемы, когда только что сгенерированное изображение сохраняется только один раз ... – mihi

ответ

3

Я бы подойти к этому с помощью:

  1. урезая CreateBitmap(). Например, возникает ли проблема, если вы удаляете все, кроме строки, которая вызывает new и строку return? Я бы предположил, что это будет, но стоит проверить. Если по нечетной вероятности проблема исчезнет с этой модификацией, используйте binary search, чтобы узнать, можете ли вы отследить ее до определенной строки.

  2. обертывание Save вызов с try/catch, чтобы увидеть, если где-то ExternalException идет молча ел. Bitmap.Save() (унаследованный от Image.Save()) говорит следующее о ExternalException:

Изображения было сохранено с неправильным форматом изображения.

-или-

Изображение было сохранено в том же файле он был создан.

Возможно, что файлы, которые не работают, уже существуют в fullPath в формате PNG с расширением .jpg?

-1

похоже, ваш FULLPATH может быть сохраняя файл с расширением png, и вы сообщаете imgSrc об сжатии изображения с использованием сжатия Jpeg.

Я бы удостоверился, что расширение fullPath jpeg или jpg, а не png.

Вот msdn doc на Сохранить.

+0

Нет полного пути что-то вроде "\\ servcer \ доля \ file.jpg". Мы сохраняем jpg с расширением «jpg». Следовательно, проблема ... Позже мы создаем точки публикации на Windows Media Server для воспроизведения плейлиста SMIL, после чего мы должны «Объявлять» файлы и форматы в точке публикации, когда точка публикации начинает воспроизводить ее, ожидает, что файл Jpg будет является расширением файла, а контент на самом деле является PNG – RyanFetz

+0

@RyanFetz. В этом случае: A) Код, который вы отправили, не является проблемой, и это где-то в другом месте.или B) У вас плохие данные, и вы не можете полагаться на расширение файла при определении используемого сжатия. – Joseph

+0

@Joseph См. Выше edit, Это код, который создает объект растрового изображения. Я не пытался быть грубым в вышеупомянутом комментарии, я просто предположил, что вы думаете, что я фактически сохраняю файл с расширением jpg, учитывая, что мы сохраняем этот формат. Я извиняюсь. – RyanFetz

1

Ну, я дал ему выстрел и попытался воспроизвести проблему с приведенным выше кодом.Вот примерно то, что я сделал:

Random r = new Random(); 
    for (int i = 0; i < max; i++) 
    { 
     System.Diagnostics.Debugger.Break() 
     int size = 1 + i; 
     int width = 1 + i; 
     SaveBitmap(@"C:\Projects\test.jpg", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, true); 
     SaveBitmap(@"C:\Projects\test.png", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, true); 
     SaveBitmap(@"C:\Projects\test.jpg", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, false); 
     SaveBitmap(@"C:\Projects\test.png", ImageFormat.Jpeg, "hello", size, width, Color.Black, Color.White, "Arial", size, false); 
    } 

    public static void SaveBitmap(string filename, ImageFormat format, string text, int height, int width, Color foregroundColor, Color backgroundColor, string fontName, int fontSize, bool antialias) 
    { 
     using (Image source = CreateBitmap(text, height, width, foregroundColor, backgroundColor, fontName, fontSize, antialias)) 
      source.Save(filename, format); 

     using (Image imgLoaded = Bitmap.FromFile(filename)) 
     { 
      if (imgLoaded.RawFormat.Guid != format.Guid) 
       throw new InvalidOperationException(); 
     } 
    } 

Это работает без проблем и тест на если (imgLoaded.RawFormat.Guid = format.Guid!) Никогда не ломается в отладчик. Я предполагаю, что у вас есть немного больше кода, чем описанная выше процедура CreateBitmap.

Моя рекомендация:

Измените код и вставить заявление проверки в приведенном выше SaveBitmap() только после вызова Image.Save(). Затем перейдите на него, как видите, как вы туда попали ...

0

Возможно, это проблема с именем файла, который вы или пользователь указывается. может быть, если он заканчивается на .png, тогда jpegformat игнорируется и генерируется файл PNG.

2

Я также испытываю эту проблему в приложении обрезки. Файл исходного изображения - JPG. Я попытался использовать несколько различных типов ImageFormat, и во всех случаях сохраненный формат представляет собой PNG с расширением файла JPG. Photoshop затем жалуется на недопустимый тип маркера JPEG. Если я переименую файл в .png, он отлично откроется в Photoshop.

Попытка этого с другим изображением создает правильный формат JPG с расширением JPG.

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

0

Вы пытались настроить ImageCodecInfo явно?

Dim enc = ImageCodecInfo.GetImageEncoders().ToList().Find(Function(e) e.MimeType = "image/png") 
objBitMap.Save(stream, enc, params) 
0

вы можете попробовать это сохранить файл

public bool ResizeImage(string OriginalFilepath, string NewFilepath) 
    { 
     Bitmap original = (Bitmap)Image.FromFile(OriginalFilepath); 
     Bitmap resized = new Bitmap(original, new Size(width,height)); 
     resized.Save(NewFilepath.jpeg); 

    } 
0

C# Win7 (64bit) VS 2010 Bitmap.Save ("wnd.bmp") сохраняет в формате PNG. MainWnd - это захват формы C# и попытка сохранить файл в виде растрового изображения.

 Bitmap bmp = new Bitmap(MainWnd.ActiveForm.Width, MainWnd.ActiveForm.Height); 
     Rectangle crec = MainWnd.ActiveForm.ClientRectangle; 
     Rectangle r = this.ClientRectangle; 
     MainWnd.ActiveForm.DrawToBitmap(bmp, r); 
     bmp.Save("wnd.bmp"); // saves as PNG not BMP !! 

00000000 89 50 4E 47 0D 0A 0A 1A - 00 00 00 0D 49 48 44 52 ‰ PNG ........ IHDR 00000010 00 00 04 00 00 0B 02 Е6 - 08 06 00 00 00 24 30 1D ....... æ ..... $ 0. 00000020 D1 00 00 00 01 73 52 47 - 42 00 AE CE 1C E9 00 00 Ñ .... sRGB.®Î.é ..

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