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