«Произошла общая ошибка в GDI +» при сохранении растрового объекта в формате jpeg, c # - PullRequest
1 голос
/ 15 июня 2009

У меня есть массив данных пикселя ushort (16-битных значений оттенков серого), и я пытаюсь сохранить его как изображение в формате JPEG. Однако мой код вызывает сбой при выполнении команды «Сохранить» в «GDI +». Я не могу понять, как это исправить. Каталог, в который я сохраняю, создается моим приложением, и я записываю в него другие файлы; так что я знаю, что это не проблема с разрешениями. Это может быть проблема повреждения данных? Я делаю что-то не так на шагах, чтобы получить данные ushort в объект Bitmap? Поскольку у меня есть ushort данных, я обнаружил, что потребовалось некоторое усилие, чтобы выяснить, как вставить их в объект Bitmap, и я, возможно, делаю это неправильно.

Вот мой код:

Bitmap img = new Bitmap(width, height, PixelFormat.Format16bppGrayScale);
Rectangle rect = new Rectangle(0,0, width, height);
BitmapData picData = img.LockBits(rect, ImageLockMode.ReadWrite, img.PixelFormat);
IntPtr pixelStartAddress = picData.Scan0;

WriteableBitmap pic = new WriteableBitmap(width, height, 96.0, 96.0, System.Windows.Media.PixelFormats.Gray16, null);

int stride = (thumb.XSize * pic.Format.BitsPerPixel + 7) / 8;
pic.WritePixels(new System.Windows.Int32Rect(0, 0, width, height), dataArray, stride, 0);  

pic.CopyPixels(new System.Windows.Int32Rect(0,0,thumb.XSize, thumb.YSize),pixelStartAddress, dataArray.Length * sizeof(ushort), stride);

img.UnlockBits(picData);
img.Save(path, ImageFormat.Jpeg);

Все это стало очень неприятным. Пожалуйста, помогите?!

Ответы [ 6 ]

3 голосов
/ 15 июня 2009

Боюсь, это как-то связано с оттенками серого / JPG. Я не знаю, поддерживает ли JPEG градации серого.

Я бы попробовал объявить растровое изображение как нормальное цветное. И тестирование.

1 голос
/ 17 октября 2012

К сожалению, GDI + не поддерживает PixelFormat.Format16bppGrayScale должным образом. Я исследовал эту давнюю проблему и не нашел решения.

Кажется, что современный подход заключается в использовании более новых API WPF в System.Windows.Media.

1 голос
/ 16 июня 2009

По поводу вашего комментария о качестве изображения (я бы ответил как комментарий, но он теряет форматирование кода):

Вы сохраняете настройки по умолчанию для экспорта в JPEG. Вы можете создать свой собственный экземпляр EncoderParameters с более высоким качеством:

var encParams = new EncoderParameters(1);
var encParams.Param[0] = new EncoderParameter(Encoder.Quality, 91L);
// get jpegEncoder by looping through ImageCodecInfo.GetImageEncoders())
image.Save("path to file", jpegEncoder, encParams); 
1 голос
/ 15 июня 2009

Я обнаружил, что у любого растрового изображения, которое я нарисовал, независимо от того, каким образом, возникали случайные проблемы с сохранением в формате JPEG (за исключением того, что вы видите). Сначала помогло клонирование изображения:

img.Clone(); // or:
img.Clone(rectangle, img.PixelFormat);

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

0 голосов
/ 15 июня 2009

Я видел, как это происходило, когда размеры, которые я сохранял, были неверны. Как ширина 0.

0 голосов
/ 15 июня 2009

Готов поспорить, что это проблема с разрешениями. GDI + является нативным компонентом, и я считаю, что для него требуются другие разрешения, чем обычное сохранение файла или что-то в этом роде. Это приложение ASP.NET? Если это так, убедитесь, что вы предоставили разрешения для процесса IIS для этой папки.

...