Сохранение RGB изображения после преобразования в файл *.bmp формата - C#

Узнай цену своей работы

Формулировка задачи:

Вот такая ситуация у меня: Есть bmp рисунок и мне нужно сделать с него 24-битную картинку. Вообщем все операции над преобразованием я сделала, но получилось, что когда я сохраняю картинку то она искажается. насколько я поняла, это связано с тем, что на сохранение я передаю массив измененного размера, а он упаковывается для сохранения с размерами как у картинки которою я первоначально открывала. как решить такую задачку. может как-то нужно изменить что-то в заголовке файла..имею ввиду параметр который отвечает за глубину цвета, ведь размер картинки это W*H*(глубина цвета) . Вообщем это кусок моей программки:
Листинг программы
  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("Enter path to image: ");
  4. string NamefileImage = Console.ReadLine();
  5. Bitmap bmp = new Bitmap(NamefileImage);
  6. // Получаем данные картинки.
  7. Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
  8. //Блокируем набор данных изображения в памяти
  9. BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
  10. // Получаем адрес первой линии.
  11. IntPtr ptr = bmpData.Scan0;
  12. // Задаём массив из Byte и помещаем в него набор данных.
  13. // int numBytes = bmp.Width * bmp.Height * 3;
  14. //На 3 умножаем - поскольку RGB цвет кодируется 3-мя байтами
  15. //Либо используем вместо Width - Stride
  16. int numBytes = bmpData.Stride * bmp.Height;
  17. // int widthBytes = bmpData.Stride;
  18. byte[] rgbValues = new byte[numBytes];
  19. // Копируем значения в массив.
  20. Marshal.Copy(ptr, rgbValues, 0, numBytes);
  21. int size = bmp.Width * bmp.Height;
  22. byte[] bmp24bitsFormat = new byte[size * 3];
  23. if ((rgbValues.Length % 3 == 0) && (rgbValues.Length == bmp.Height * bmp.Width * 3))
  24. {
  25. // bmp24bitsFormat = new byte[rgbValues.Length];
  26. for (int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i++)
  27. {
  28. bmp24bitsFormat[j++] = rgbValues[i];
  29. }
  30. Console.WriteLine("3");
  31. Console.WriteLine(rgbValues.Length);
  32. Console.WriteLine(bmp24bitsFormat.Length);
  33. }
  34.  
  35. if ((rgbValues.Length == bmp.Height * bmp.Width))
  36. {
  37. bmp24bitsFormat = new byte[rgbValues.Length * 3];
  38. for (int i = 1079, j = 1079; i < rgbValues.Length && j < bmp24bitsFormat.Length; i++)
  39. {
  40. var value = rgbValues[i];
  41. bmp24bitsFormat[j++] = value;
  42. bmp24bitsFormat[j++] = value;
  43. bmp24bitsFormat[j++] = value;
  44. }
  45. numBytes = (numBytes * 3);
  46. Console.WriteLine("1");
  47. Console.WriteLine(rgbValues.Length);
  48. Console.WriteLine(bmp24bitsFormat.Length);
  49. }
  50. if ((rgbValues.Length % 4 == 0) && (rgbValues.Length == (bmp.Height * bmp.Width) * 4))
  51. {
  52. // bmp24bitsFormat = new byte[rgbValues.Length * 3 / 4];
  53. for (int i = 0, j = 0; i < rgbValues.Length && j < bmp24bitsFormat.Length; i++)
  54. {
  55. bmp24bitsFormat[j++] = rgbValues[i];
  56. bmp24bitsFormat[j++] = rgbValues[i++];
  57. bmp24bitsFormat[j++] = rgbValues[i++];
  58. i++;
  59. }
  60. Console.WriteLine("4");
  61. Console.WriteLine(rgbValues.Length);
  62. Console.WriteLine(bmp24bitsFormat.Length);
  63. numBytes = (numBytes * 3 / 4);
  64. }
  65. // Копируем набор данных обратно в изображение
  66. Marshal.Copy(bmp24bitsFormat, 0, ptr, numBytes);
  67. // Разблокируем набор данных изображения в памяти.
  68. bmp.UnlockBits(bmpData);
  69. bmp.Save(@"C:\Users\img.bmp");
  70. Console.ReadKey();
  71. }

Решение задачи: «Сохранение RGB изображения после преобразования в файл *.bmp формата»

textual
Листинг программы
  1. using System.Drawing;
  2. using System.Drawing.Imaging;
  3.  
  4. namespace ConsoleApplication157
  5. {
  6.     class Program
  7.     {
  8.         public static void Main(string[] args)
  9.         {
  10.             var img = Image.FromFile(@"c:\\1.png");
  11.             To24bpp(img).Save(@"c:\\2.png");
  12.         }
  13.  
  14.         static Bitmap To24bpp(Image img)
  15.         {
  16.             var bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format24bppRgb);
  17.             using (var gr = Graphics.FromImage(bmp))
  18.                 gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
  19.             return bmp;
  20.         }
  21.     }
  22. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.462 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы