Вопрос пользователя связан с отображением монохромного изображения в формате Mono8 в компоненте TImage в среде разработки Delphi. При попытке использования 8-битного формата пикселей (pf8Bit) и установки свойства Monochrome в значение False, изображение отображается с искажениями: часть изображения имеет монохромный вид, а другая часть — ложные цвета. При установке Monochrome в True, изображение отображается только в 1/4 от ожидаемого размера, остальная часть экрана залита белым цветом.
Описание проблемы
Пользователь столкнулся с проблемой при работе с компонентом TBitmap в Delphi. Он пытается присвоить буфер с данными в формате Mono8 (Monochrome 8 Bits) битмапу и затем отобразить его в компоненте TImage. При использовании 24-битного формата (pf24Bit) и отключенной функции Monochrome (Monochrome := False), изображение отображается корректно в серых тонах. Однако, при попытке использовать 8-битный формат (pf8Bit) и изменении состояния Monochrome, изображение отображается некорректно.
Подробности кода
В коде, предоставленном пользователем, есть две процедуры для копирования данных в битмап: CopyToBitmapMono824 для 24-битного формата и CopyToBitmapMono8 для 8-битного. В последнем случае, при включенном Monochrome (Monochrome := True), изображение отображается только в 1/4 от ожидаемого размера, что, как выяснилось, было связано с предварительным сохранением в JPEG, что не показано в коде.
Решение проблемы
Подтвержденный ответ указывает на то, что свойство Monochrome имеет смысл только для битмапов в формате pf1bit. При установке Monochrome := True для битмапов с другими форматами пикселей, происходит изменение формата битмапа на DDB (Device Dependent Bitmap), что приводит к некорректному отображению, поскольку экран обычно имеет 32-битный формат.
Для корректного использования 8-битных битмапов необходимо изменить стандартную цветовую палитру, используемую в компоненте TBitmap, на монохромную. Это достигается путем создания и применения градиентной палитры серых цветов.
procedure CopyToBitmapMono8(_Buffer: PByte; _Bmp: TBitmap);
var
y, x: Integer;
ScanLine: PByteArray;
begin
for y := 0 to _Bmp.Height - 1 do begin
ScanLine := _Bmp.ScanLine[y];
for x := 0 to _Bmp.Width - 1 do begin
ScanLine[x] := _Buffer^;
Inc(_Buffer);
end;
end;
end;
var
FBmp: TBitmap;
Buffer: PByteArray;
i: Integer;
begin
GetMem(Buffer, SizeOf(Byte) * 512 * 100);
for i := 0 to 512 * 100 - 1 do
Buffer[i] := (i and 511) div 2; // создание градиента серого цвета
FBmp := TBitmap.Create;
FBmp.Width := 512;
FBmp.Height := 100;
FBmp.PixelFormat := pf8bit;
CopyToBitmapMono8(@Buffer, FBmp);
Canvas.Draw(0, 0, FBmp); // Рисуем на стандартной палитре
// Создание и применение монохромной палитры
FBmp.Palette := MakeGrayPalette;
CopyToBitmapMono8(@Buffer, FBmp);
Canvas.Draw(0, 110, FBmp);
end;
function TForm1.MakeGrayPalette: HPalette;
var
i: Integer;
lp: TLogPalette;
begin
lp.palVersion := $300;
lp.palNumEntries := 256;
for i := 0 to 255 do begin
lp.palPalEntry[i].peRed := i;
lp.palPalEntry[i].peGreen := i;
lp.palPalEntry[i].peBlue := i;
lp.palPalEntry[i].peFlags := PC_NOCOLLAPSE;
end;
Result := CreatePalette(lp);
end;
Важно отметить, что приведенный код является лишь примером и может потребовать дополнительной настройки в зависимости от конкретных требований задачи.
Заключение
Правильная настройка палитры и формата пикселей битмапа является ключом к корректному отображению монохромных изображений в компоненте TImage в Delphi. Создание и применение монохромной палитры позволяет избежать искажений и отобразить изображение в серых тонах без ложных цветов.
заключается в некорректном отображении монохромного изображения в формате Mono8 в компоненте TImage в среде разработки Delphi из-за неправильной настройки свойств битмапа и палитры.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.