|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.03.2013, 11:23 | #1 |
Пользователь
Регистрация: 08.12.2009
Сообщений: 39
|
Сохранение jpg с глубиной цвета 8
Возникла проблема, и прошу помощи в её решении.
Написал класс, с помощью которого можно маскировать изображения (закрашивать чёрными полосками некоторые участки). Так как для изображений с индексированными точками не получается получить объект Graphics, создаю новый объект Bitmap с иным PixelFormat и произвожу закрашивание на нём. Но вот сохранить его в формате jpg, с глубиной цвета 8 (всё как у исходного) и без потери качества (изображение становится темнее) не получается. Текст класса: using System;using System.Drawing; using System.Drawing.Imaging; using System.IO; public class MaskableImage2 : IDisposable { private Graphics g = null; private Bitmap bitmap = null; private PixelFormat pixelFormat; private ColorPalette palette; public MaskableImage2(string path) { using (StreamReader reader = new StreamReader(path)) { Bitmap bitmap1 = new Bitmap(reader.BaseStream); pixelFormat = bitmap1.PixelFormat; if (pixelFormat == PixelFormat.Format1bppIndexed || pixelFormat == PixelFormat.Format4bppIndexed || pixelFormat == PixelFormat.Format8bppIndexed) { try { palette = bitmap1.Palette; bitmap = bitmap1.Clone(new Rectangle(0, 0, bitmap1.Width, bitmap1.Height), PixelFormat.Format24bppRgb); bitmap.SetResolution(bitmap1.Horizo ntalResolution, bitmap1.VerticalResolution); g = Graphics.FromImage(bitmap); } finally { bitmap1.Dispose(); } } else { bitmap = bitmap1; g = Graphics.FromImage(bitmap); } } } public void Mask(int y1, int y2) { g.FillRectangle(Brushes.Black, new Rectangle(0, y1, bitmap.Width, y2 - y1)); } public void Save1(string fileName) { if (bitmap.PixelFormat == pixelFormat) bitmap.Save(fileName); else using (Bitmap b2 = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), pixelFormat)) { b2.Palette = palette; b2.SetResolution(bitmap.HorizontalR esolution, bitmap.VerticalResolution); b2.Save(fileName); } } public void Save2(string fileName) { if (bitmap.PixelFormat == pixelFormat) bitmap.Save(fileName); else using (FileStream fileStream = File.OpenWrite(fileName)) { EncoderParameters myEncoderParameters = new EncoderParameters(1); myEncoderParameters.Param[0] = new EncoderParameter(Encoder.ColorDepth , 8L); bitmap.Save(fileStream, GetEncoderInfo("image/jpeg"), myEncoderParameters); } } public void Dispose() { if (g != null) g.Dispose(); if (bitmap != null) bitmap.Dispose(); } private static ImageCodecInfo GetEncoderInfo(String mimeType) { ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders(); for (int j = 0; j < encoders.Length; ++j) { if (encoders[j].MimeType == mimeType) return encoders[j]; } return null; } } Проблемы возникают именно при работе с индексированными изображениями. Я пробовал сохранять изображения несколькими способами. При сохранении методом Save1 удаётся получить изображение с глубиной цвета 8, но по факту оно имеет формат png и получается темнее исходного. При сохранении методом Save2 изображение нужного формата, нужного качества, но глубина цвета – 24. Не понимаю, почему при явном указании глубины цвета 8 «myEncoderParameters.Param[0] = new EncoderParameter(Encoder.ColorDepth , 8L);», она принимается только для форматов gif и tiff, а для всех остальных у сохранённого изображения глубина цвета всё равно получается 24. |
28.03.2013, 15:22 | #2 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
Не бывает jpg с индексированными цветами; с глубиной цвета 8 - только в градациях серого.
Непонятно, почему png получается темнее... Может быть, палитры не хватает? То есть была уже вся использована, а тут ещё чёрный добавился, которого не было? |
29.03.2013, 17:00 | #3 |
Пользователь
Регистрация: 08.12.2009
Сообщений: 39
|
Но исходное изображение формата ".JPG" и именно с глубиной цвета 8. Иначе бы я и не пытался это осуществить. Извините, не имею права его прикрепить, он он есть
|
29.03.2013, 17:03 | #4 |
Пользователь
Регистрация: 08.12.2009
Сообщений: 39
|
Да, может быть и в градациях серого. Я с изображениями мало работал и не в курсе, с ним надо как-то по-другому обходиться?
|
29.03.2013, 17:11 | #5 |
Пользователь
Регистрация: 08.12.2009
Сообщений: 39
|
В общем PixelFormat, получаемого из него объекта Bitmap, равен "Format8bppIndexed".
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Сохранение в файл .jpg image с наложенным текстом в Edit | alllen | Помощь студентам | 3 | 20.08.2011 17:13 |
Изображения с высокой глубиной цвета | ita4i361 | C# (си шарп) | 0 | 12.07.2011 21:17 |
Сохранение файлов расположенных по ссылке(*.jpg) | Jnas | Microsoft Office Excel | 9 | 11.02.2011 17:37 |
сохранение формы в jpg | acid_bmstu | Общие вопросы Delphi | 1 | 13.12.2009 02:11 |
Сохранение заданий на печать в файл изображения JPG | DimD | Фриланс | 1 | 15.04.2009 19:27 |