Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2013, 11:23   #1
DronLee
Пользователь
 
Регистрация: 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.
DronLee вне форума Ответить с цитированием
Старый 28.03.2013, 15:22   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Не бывает jpg с индексированными цветами; с глубиной цвета 8 - только в градациях серого.
Непонятно, почему png получается темнее... Может быть, палитры не хватает? То есть была уже вся использована, а тут ещё чёрный добавился, которого не было?
Somebody вне форума Ответить с цитированием
Старый 29.03.2013, 17:00   #3
DronLee
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 39
Сообщение

Но исходное изображение формата ".JPG" и именно с глубиной цвета 8. Иначе бы я и не пытался это осуществить. Извините, не имею права его прикрепить, он он есть
DronLee вне форума Ответить с цитированием
Старый 29.03.2013, 17:03   #4
DronLee
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 39
Смущение

Да, может быть и в градациях серого. Я с изображениями мало работал и не в курсе, с ним надо как-то по-другому обходиться?
DronLee вне форума Ответить с цитированием
Старый 29.03.2013, 17:11   #5
DronLee
Пользователь
 
Регистрация: 08.12.2009
Сообщений: 39
По умолчанию

В общем PixelFormat, получаемого из него объекта Bitmap, равен "Format8bppIndexed".
DronLee вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение в файл .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