Битмап Из Массива.

  • Автор темы EugenOS
  • Дата начала
E

EugenOS

Добрый день всем.
Имею проблему. В основной программе из больших (1600 x 1200 ) картинок делаю массивы и обрабатываю их как мне нужно.
Для проверки решил сохранить обрабатываемые области (64 x 240) в файлики (результат программы дает постоянную ошибку точек а 100..150, хотел узнать все ли правильно )
Для этого ранее созданную область копирую в массив Int32 только в младший байт, т.е. включаю кое где одну составляющую цвета (исходные картинки черно белые, так что для проверки этого достаточно). Но при сохранении вижу белый прямоугольник. По-видимому я чего-то не доделываю...но не могу найти и понять чего:
C++:
		public static Bitmap bufToBmp( Int32[] buf, Rectangle size ) // использую для размера Rect, просто потому что в основной программе он уже есть с нужными значениями, незачем плодить сущности
{
Int32 len = size.Width * size.Height;
Bitmap retImg = new Bitmap(size.Width, size.Height);
PixelFormat pxf = PixelFormat.Format32bppArgb;
BitmapData bmpData = retImg.LockBits(
new Rectangle(0, 0, size.Width, size.Height) , ImageLockMode.ReadWrite, pxf );
Marshal.Copy( buf, 0, bmpData.Scan0, len );
retImg.UnlockBits(bmpData);
return retImg;
}

...
Int32 len = testRect.Width * testRect.Height;  // размер тестируемой области
Int32[] buf = new Int32[len];
for( int i=0; i< len; i++ )
{
byte b = bytes[i];  // в bytes[] лежит байтовый образ картинки (тоже одна составляющая) который обрабатывается программой, им судя по результату (дающему на разных картинках строго линейную погрешность) содержит адекватные данные.
buf[i] = b; // через переменную кидал, потому что изначально собирал сдвигом все три составляющих.
}
return bufToBmp(buf, testRect);
...
 
E

EugenOS

почитал немного про битмапы...оказалось в формате argb32 старший байт (А) отвечает за прозрачность.
помогло:
C++:
 buf[i] = unchecked((Int32)0xFF000000 + bytes[i] );
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!