powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение jpg с глубиной цвета 8
1 сообщений из 1, страница 1 из 1
Сохранение jpg с глубиной цвета 8
    #38201901
Андрей87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла проблема, и прошу помощи в её решении.
Написал класс, с помощью которого можно маскировать изображения (закрашивать чёрными полосками некоторые участки). Так как для изображений с индексированными точками не получается получить объект 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.HorizontalResolution, 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.HorizontalResolution, 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.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранение jpg с глубиной цвета 8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]