Сохранение RGB изображения после преобразования в файл *.bmp формата - C#
Формулировка задачи:
Вот такая ситуация у меня:
Есть bmp рисунок и мне нужно сделать с него 24-битную картинку.
Вообщем все операции над преобразованием я сделала, но получилось, что когда я сохраняю картинку то она искажается. насколько я поняла, это связано с тем, что на сохранение я передаю массив измененного размера, а он упаковывается для сохранения с размерами как у картинки которою я первоначально открывала.
как решить такую задачку. может как-то нужно изменить что-то в заголовке файла..имею ввиду параметр который отвечает за глубину цвета, ведь размер картинки это W*H*(глубина цвета) .
Вообщем это кусок моей программки:
static void Main(string[] args) { Console.WriteLine("Enter path to image: "); string NamefileImage = Console.ReadLine(); Bitmap bmp = new Bitmap(NamefileImage); // Получаем данные картинки. Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); //Блокируем набор данных изображения в памяти BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat); // Получаем адрес первой линии. IntPtr ptr = bmpData.Scan0; // Задаём массив из Byte и помещаем в него набор данных. // int numBytes = bmp.Width * bmp.Height * 3; //На 3 умножаем - поскольку RGB цвет кодируется 3-мя байтами //Либо используем вместо Width - Stride int numBytes = bmpData.Stride * bmp.Height; // int widthBytes = bmpData.Stride; byte[] rgbValues = new byte[numBytes]; // Копируем значения в массив. Marshal.Copy(ptr, rgbValues, 0, numBytes); int size = bmp.Width * bmp.Height; byte[] bmp24bitsFormat = new byte[size * 3]; if ((rgbValues.Length % 3 == 0) && (rgbValues.Length == bmp.Height * bmp.Width * 3)) { // bmp24bitsFormat = new byte[rgbValues.Length]; for (int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i++) { bmp24bitsFormat[j++] = rgbValues[i]; } Console.WriteLine("3"); Console.WriteLine(rgbValues.Length); Console.WriteLine(bmp24bitsFormat.Length); } if ((rgbValues.Length == bmp.Height * bmp.Width)) { bmp24bitsFormat = new byte[rgbValues.Length * 3]; for (int i = 1079, j = 1079; i < rgbValues.Length && j < bmp24bitsFormat.Length; i++) { var value = rgbValues[i]; bmp24bitsFormat[j++] = value; bmp24bitsFormat[j++] = value; bmp24bitsFormat[j++] = value; } numBytes = (numBytes * 3); Console.WriteLine("1"); Console.WriteLine(rgbValues.Length); Console.WriteLine(bmp24bitsFormat.Length); } if ((rgbValues.Length % 4 == 0) && (rgbValues.Length == (bmp.Height * bmp.Width) * 4)) { // bmp24bitsFormat = new byte[rgbValues.Length * 3 / 4]; for (int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i++) { bmp24bitsFormat[j++] = rgbValues[i]; bmp24bitsFormat[j++] = rgbValues[i++]; bmp24bitsFormat[j++] = rgbValues[i++]; i++; } Console.WriteLine("4"); Console.WriteLine(rgbValues.Length); Console.WriteLine(bmp24bitsFormat.Length); numBytes = (numBytes * 3 / 4); } // Копируем набор данных обратно в изображение Marshal.Copy(bmp24bitsFormat, 0, ptr, numBytes); // Разблокируем набор данных изображения в памяти. bmp.UnlockBits(bmpData); bmp.Save(@"C:\Users\img.bmp"); Console.ReadKey(); }
Решение задачи: «Сохранение RGB изображения после преобразования в файл *.bmp формата»
textual
Листинг программы
using System.Drawing; using System.Drawing.Imaging; namespace ConsoleApplication157 { class Program { public static void Main(string[] args) { var img = Image.FromFile(@"c:\\1.png"); To24bpp(img).Save(@"c:\\2.png"); } static Bitmap To24bpp(Image img) { var bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb); using (var gr = Graphics.FromImage(bmp)) gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); return bmp; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д