Перейти к содержанию
Fire Monkey от А до Я
  • 0

Монохромный TBitmap


Вопрос

Опубликовано

Имею в своем проекте огромный невидимый TImage, из которого при необходимости вырезаются те или иные кусочки и показываются пользователям. Так оказалось сделать удобнее, чем хранить эти кусочки в БД. Изображение монохромное, из черных и белых пикселей, цвета не нужны. Я полагал, что достаточно загрузить в TImage.MultiResBitmap монохромный файл, чтобы битмэп и трактовался программой как монохромный. Но сейчас проверил это функцией PixelFormatToString - и увидел, что пиксельный формат имеет значение BGRA. Похоже, под цвета по-прежнему выделяются ресурсы, которые можно было бы сэкономить. Возникают следующие вопросы:

1. Действительно ли PixelFormat=BGRA означает, что мой TBitmap не является монохромным и занимает в памяти в разы больше места?

2. Если да, то есть ли способ сделать его монохромным?

Рекомендуемые сообщения

  • 0
Опубликовано (изменено)

Точно место в вики абракадабры не скажу, но там кажется кратно 16 бита пиксель задается. 24 бита например не сделать. Видимо, нет смысла экономить на формате хранения, т.к. далее оно идет в Opengl или куда там еще с его 32 битным цветом.

Изменено пользователем POV
  • 0
Опубликовано
1 час назад, POV сказал:

Возможно, я это имел в виду.
http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.Types.TPixelFormat

Да, я это видел, конечно. Но очень плохо растолковано. Какое из этих значений соответствует монохромному изображению? L, может быть? И как именно этот формат выставлять? У TBitmap это свойство Read-only.

  • 0
Опубликовано

Ну если тут ещё кто-то бродит...

Тоже нужно было сделать изображение чёрно-белым для пересылки в Base64. Вот так получилось:

procedure TForm1.ButtonStopClick(Sender: TObject);
var SendData:TBitmapSurface; SizeX,SizeY,i,j:integer; Bmp:TBitMapData;
begin
  CameraComponent1.Active:=false;
  SendData:=TBitmapSurface.Create; SizeX:=0; SizeY:=0;
  if BmpCut.Map(TMapAccess.Read,Bmp) then
  begin
    SizeX:=Bmp.Width; SizeY:=Bmp.Height;
    SendData.SetSize(SizeX,SizeY,TPixelFormat.L);
    for j:=0 to SizeY-1 do for i:=0 to SizeX-1 do SendData.Pixels[i,j]:=Bmp.GetPixel(i,j);
    BmpCut.Unmap(Bmp);
  end;
  Label2.Text:=IntToStr(SizeX)+'X'+IntToStr(SizeY)+'X'+IntToStr(SendData.BytesPerPixel);
  Image1.Bitmap.Assign(SendData);
  BmpCut.Free; SendData.Free;
end;

Label2.Text показал 1 байт на пиксель, в Image1 было чёрно-белое фото. Собственно отсылки тут нет.

Только не нужно хранить в невидимом TImage, храните в TBitmapSurface.

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...