Добрый. Можно уточнить, по какому алгоритму кодируются данные о изображении в структуре XIMAGEDESC? В настоящий момент, я имею пример на QT, где выполнено следующее:
Что не расскрывает, каким образом я могу получить изображение на c# Я пытаюсь сделать изображение по принципу BITMAP
Код
public static SystemDrawing::System.Drawing.Bitmap Convert2Bitmap(this XIMAGEDESC imageInfo)
{
var bytes = imageInfo.GetBytes();
var bitmap = new SystemDrawing::System.Drawing.Bitmap(imageInfo.Width, imageInfo.Height,PixelFormat.Format32bppRgb);
// Текущая палитра
var paletteBitmap = new SystemDrawing::System.Drawing.Bitmap(imageInfo.Width, imageInfo.Height,PixelFormat.Format8bppIndexed);
for (int i = 0; i < 256; i++)
paletteBitmap.Palette.Entries[i] = SystemDrawingColor.FromArgb(255, i, i, i);
// Заполняем изображение
for (int y = 0; y < imageInfo.Height; y++)
{
for (int x = 0; x < imageInfo.Width; x++)
{
var indexPalette = bytes[x + (y * imageInfo.Width)];
var color = paletteBitmap.Palette.Entries[indexPalette];
bitmap.SetPixel(x,y, color);
}
}
return bitmap;
}
В результате, я получаю изображение, вида (явно не корректно).
Добрый. Константин Ганюшин Выше, я привел пример формирования изображения именно по указанным Вами характеристиками. Посмотрите картинку пжл. Так не работает. Я задам Вам еще раз вопрос. Как система ГисПонорама формирует массив в структуре XIMAGEDESC?
Исходя из анализа приведенного кода из переданной памяти последовательно считывается по одному байту и интерпретируется как индекс палитры:
Цитата
var indexPalette = bytes[x + (y * imageInfo.Width)];
В то время, как в памяти последовательно для каждого цвета располагается четыре байта в формате 0xffRRGGBB. Пожалуйста, проанализируйте данный участок кода на корректность.
А может быть дело в разрешении? Например - один пиксель одного цвета в ГисПонорама - это не точка, а скажем 6x6 точек.
Код
public static SystemDrawing::System.Drawing.Bitmap ToBitmap1(this XIMAGEDESC imageInfo)
{
var bytes = imageInfo.GetBytes();
var bitmap = new SystemDrawing::System.Drawing.Bitmap(imageInfo.Width, imageInfo.Height,
PixelFormat.Format32bppArgb);
bitmap.SetResolution(10.0F, 10.0F);
for( int x = 0; x< imageInfo.Width * imageInfo.Height * imageInfo.CellSize ; x += imageInfo.CellSize )
{
var blue = bytes[x];
var green = bytes[x + 1];
var red = bytes[x + 2];
var alfa = bytes[x + 3];
var color = SystemDrawingColor.FromArgb(red, green, blue);
//var color = SystemDrawingColor.FromArgb(alfa, red, green, blue);
bitmap.SetPixel((x / imageInfo.CellSize) % imageInfo.Width, x / imageInfo.CellSize / imageInfo.Width, color);
}
return bitmap;
}
Константин Ганюшин написал: Исходя из сформированного QImage, XIMAGEDESC.Point заполнен как массив шириной exampleWidth и высотой exampleHeight формата RGB-32 (0xffRRGGBB).
Данное описание корректно. На текущий момент мы можем привести пример формирования BITMAP на C++ с сохранением в файл:
public static SystemDrawing::System.Drawing.Bitmap ToBitmap(this XIMAGEDESC imageInfo, byte[] bytes)
{
var bitmap = new SystemDrawing::System.Drawing.Bitmap(imageInfo.Width, imageInfo.Height,
PixelFormat.Format32bppArgb);
var widthbits = imageInfo.Width * 4;
var data = bitmap.LockBits(new Rectangle(0, 0, imageInfo.Width, imageInfo.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
for (int i=0; i < imageInfo.Height; i++)
{
var startIndex = widthbits * i;
var destPointer = (IntPtr)(data.Scan0.ToInt64() + (long)(i * data.Stride));
Marshal.Copy(bytes, startIndex, destPointer, widthbits);
}
bitmap.UnlockBits(data);
return bitmap;
}
Далее, нарисовал тестовую картинку и ее сконвертировал в массив байт.
Код
public static byte[] ToBytes(this XIMAGEDESC imageInfo, string fileName)
{
var bytes = new byte[imageInfo.GetSize()];
var bitmap = new SystemDrawing::System.Drawing.Bitmap(fileName);
BitmapData data=bitmap.LockBits(new Rectangle(0, 0, imageInfo.Width, imageInfo.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
Marshal.Copy(data.Scan0, bytes, 0, imageInfo.GetSize());
bitmap.UnlockBits(data);
return bytes;
}
Далее, выполнил проверки. Считал изображение и записал его повторно.
Код
var bytes = _imageInfo.ToBytes("/home/valex/Projects/War/Comandor.Net/Docs/Templates/2.bmp");
var bitmap = _imageInfo.ToBitmap(bytes);
bitmap.Save("/home/valex/Projects/War/Comandor.Net/Docs/Templates/1.bmp");
Получил полную копию. Все работает корректно. Затем, выполняю фцнкцию
Код
mapViewImageToXImage
Откуда получаю массив из структуры XIMAGEDESC и уже этот массив я записываю в файл и получаю НЕ корректно изображение. Я делаю вывод, что либо функция mapViewImageToXImage работает не корректно, либо получение массива из структуры XIMAGEDESC нужно делать по другому.
Код
public static byte[] GetBytes(this XIMAGEDESC imageInfo)
{
var bytes = new byte[imageInfo.GetSize()];
Marshal.Copy(imageInfo.Point, bytes, 0, imageInfo.GetSize());
return bytes;
}