Сохранение 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;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д