Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибок отображения монохромного изображения в TImage с использованием Mono8 в Delphi

Delphi , Графика и Игры , Bitmap

Вопрос пользователя связан с отображением монохромного изображения в формате 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Bitmap ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 15:46:43/0.0036871433258057/0