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

Ошибка отображения цветного изображения в формате PF1bit для TImage в Delphi

Delphi , Графика и Игры , Изображения

При работе с графикой в среде Delphi иногда возникают проблемы, связанные с некорректной работой функций отображения изображения в различных форматах. Одной из таких проблем является ошибка отображения цветного изображения в формате PF1bit для компонента TImage. Эта ошибка проявляется в том, что при попытке отобразить изображение в одно битном формате, оно отображается полностью черным.

Пример кода, вызывающего проблему:

image1.Picture.Bitmap.LoadFromFile('example.bmp'); // Загрузка изображения в формате RGB PF24bit разрешением 320x240 пикселей
image1.Picture.Bitmap.PixelFormat := pf1bit;
for i := 0 to Round(image1.Picture.Bitmap.Canvas.Height / 2) - 1 do
begin
  for j := 0 to Round(image1.Picture.Bitmap.Canvas.Width / 2) - 1 do
  begin
    image1.Picture.Bitmap.Canvas.Pixels[i, j] := 1; // Попытка установить пиксель в белый цвет, но результат черный
  end;
end;

Описание проблемы:

Пользователь столкнулся с проблемой, когда, пытаясь отобразить изображение в формате PF1bit, получил полностью черное изображение. Это происходит из-за особенностей работы с одно битными изображениями, где каждый байт представляет собой восемь пикселей, и необходимо использовать операции побитового сдвига для корректного отображения данных.

Подтвержденный ответ:

Для корректной работы с форматом PF1bit необходимо упаковывать восемь пикселей в один байт. Ниже приведен пример кода, который демонстрирует, как это можно сделать:

var
  bm: TBitmap;
  i, j: Integer;
  dest: ^Byte;
  b: Byte;
  bitsSet: Integer;
begin
  bm := TBitmap.Create;
  Try
    bm.PixelFormat := pf1bit;
    bm.SetSize(63, 30);
    for i := 0 to bm.Height - 1 do begin
      b := 0;
      bitsSet := 0;
      dest := bm.Scanline[i];
      for j := 0 to bm.Width - 1 do begin
        b := b shl 1;
        if odd(i + j) then
          b := b or 1;
        inc(bitsSet);
        if bitsSet = 8 then begin
          dest^ := b;
          inc(dest);
          b := 0;
          bitsSet := 0;
        end;
      end;
      if b <> 0 then
        dest^ := b shl (8 - bitsSet);
    end;
    bm.SaveToFile('c:\desktop\out.bmp');
  Finally
    bm.Free;
  End;
end;

Также был предложен альтернативный способ использования свойства Pixels компонента TBitmap для работы с одно битными изображениями:

var
  bm: TBitmap;
  i, j: Integer;
  Color: TColor;
begin
  bm := TBitmap.Create;
  Try
    bm.PixelFormat := pf1bit;
    bm.SetSize(63, 30);
    for i := 0 to bm.Height - 1 do begin
      for j := 0 to bm.Width - 1 do begin
        if odd(i + j) then begin
          Color := clBlack;
        end else begin
          Color := clWhite;
        end;
        bm.Canvas.Pixels[j, i] := Color;
      end;
    end;
    bm.SaveToFile('c:\desktop\out.bmp');
  Finally
    bm.Free;
  End;
end;

Важно понимать, что при работе с PF1bit форматом необходимо учитывать, что один байт представляет восемь пикселей, и для их упаковки используются операции сдвига и побитового сложения. Это позволяет корректно отобразить данные в одно битном изображении.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с проблемой некорректного отображения цветного изображения в формате PF1bit для компонента TImage в среде разработки Delphi из-за особенностей работы с одно битными изображениями.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Изображения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:52:12/0.0018680095672607/0