|
Сохранение jpg с глубиной цвета 8
|
|||
---|---|---|---|
#18+
Возникла проблема, и прошу помощи в её решении. Написал класс, с помощью которого можно маскировать изображения (закрашивать чёрными полосками некоторые участки). Так как для изображений с индексированными точками не получается получить объект 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2013, 11:32 |
|
|
start [/forum/topic.php?fid=20&msg=38201901&tid=1404944]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
3ms |
others: | 21ms |
total: | 143ms |
0 / 0 |