Проблема такая — есть массив пикселей монохромного изображения, каждому пикселю соответствует 1 байт, то есть получается 256 градаций серого. Пытаюсь создать битмэп с помощью CreateBitmap. Это получается только при двух значениях глубины цвета — 1 или 32, при остальных значениях на форме ничего не отображается, а при попытке сохранения файла с рисунком — вылезает ошибка "Недостаточно памяти". Можно каким-то образом работать с такими изображениями — без преобразования их в 32-битный формат?
Спасибо.
Здравствуйте, nya, Вы писали:
nya>Проблема такая — есть массив пикселей монохромного изображения, каждому пикселю соответствует 1 байт, то есть получается 256 градаций серого. Пытаюсь создать битмэп с помощью CreateBitmap. Это получается только при двух значениях глубины цвета — 1 или 32, при остальных значениях на форме ничего не отображается, а при попытке сохранения файла с рисунком — вылезает ошибка "Недостаточно памяти". Можно каким-то образом работать с такими изображениями — без преобразования их в 32-битный формат?
nya>Спасибо.
Я просто приделывал к массиву заголовок (bmp-файла) и загружал в Bitmap через LoadFromFile или LoadFromStream. Это было давно.
Здравствуйте, nya, Вы писали:
nya>Проблема такая — есть массив пикселей монохромного изображения, каждому пикселю соответствует 1 байт, то есть получается 256 градаций серого. Пытаюсь создать битмэп с помощью CreateBitmap. Это получается только при двух значениях глубины цвета — 1 или 32, при остальных значениях на форме ничего не отображается, а при попытке сохранения файла с рисунком — вылезает ошибка "Недостаточно памяти". Можно каким-то образом работать с такими изображениями — без преобразования их в 32-битный формат?
nya>Спасибо.
Можно. CreateDIBSection(). Если нужно массив пикселей только рисовать на экране, то можно ничего и не создавать, достаточно StretchDIBits().
Ну и наверное TBitmap.PixelFormat тоже будет работать...
Когда-то делал так
var
HPal: HPALETTE = 0;
....
function GrayPalette: HPALETTE;
var
i: Integer;
begin
Result := HPal; //глобальная переменная, если создано то вернуть предыдущее значение
if HPal <> 0 then
exit;
Pal.lPal.palVersion:=$300;
Pal.lPal.palNumEntries:=256;
for i := 0 to 255 do
begin
Pal.lpal.PalpalEntry[i].peRed := i;
Pal.lpal.PalpalEntry[i].peGreen := i;
Pal.lpal.PalpalEntry[i].peBlue := i;
Pal.lpal.PalpalEntry[i].peFlags := 0;
end;
HPal := CreatePalette(Pal.lpal);
Result := HPal;
end;
что-то типа
....
// Image.Picture.Bitmap ... // Установить размеры
Image.Picture.Bitmap.PixelFormat := pf8bit;
Image.Picture.Bitmap.Palette:= GrayPalette;
// скопировать на Image.Picture.Bitmap свою картинку
// можно записать в файл
...