Сохранение 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;
        }
    }
}

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


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

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

13   голосов , оценка 4.462 из 5
Похожие ответы