Иллюстрированный самоучитель по Delphi 7 для профессионалов

Класс TBitmap

При любом внешнем обращении к дескриптору битовой карты и любой попытке рисовать на ее канве разделение одной картинки несколькими объектами прерывается, и объект получает собственную копию содержимого дескриптора. Для этого есть методы:

  • procedure Dormant – выгружает изображение в поток и уничтожает дескрипторы битовой карты и палитры;
  • procedure Freeimage – "освобождающий" дескриптор битовой карты для дальнейшего использования и внесения изменений. Это означает, что если на данный дескриптор есть ссылки, то он дублируется; поток очищается.

Битовая карта может быть монохромной и цветной, что определено свойством:

property Monochrome: Boolean;

Значение True соответствует монохромной битовой карте. При его изменении происходит преобразование содержимого к требуемому виду.

За прозрачность битовой карты отвечают следующие свойства:

property TransparentColor: TColor;
type TTransparentMode = (tmAuto, tmFixed);
property TransparentMode: TTransparentMode;

Если свойство TransparentMode установлено в режим tmAuto, то за прозрачный (фоновый) принимается цвет верхнего левого пиксела. В противном случае этот цвет берется из свойства Transparentcolor.

Битовая карта может использоваться в качестве маски для других битовых карт. В этом случае она превращается в двухцветную, где в белый цвет окрашиваются точки фона (см. свойство Transparentcolor), а в черный – все остальные. Для поддержки этого режима служат следующие методы и свойства:

procedure Mask(Transparentcoior: TColor);
property MaskHandle: HBitmap;
function ReleaseMaskHandle: HBitmap;

Наконец, последним по счету будет рассмотрено очень важное свойство битовой карты TBitmap. Если формат ее хранения – DIB, то есть возможность получить доступ к данным самой битовой карты:

property ScanLine[Row: Integer]: Pointer;

Это свойство представляет собой массив указателей на строки с данными битовой карты. Параметр ROW содержит номер строки. Следует помнить, что в большинстве случаев строки в битовой карте упорядочены в памяти снизу вверх и фактически первой после заголовка хранится нижняя строка. Код, возвращающий значение свойства ScanLine, это учитывает; поэтому не удивляйтесь, если с ростом параметра ROW значение свойства уменьшается.

Внутри строки данные упорядочены в соответствии с форматом (pixelFormat). Для формата pfsbit все просто – каждый байт в строке соответствует одному пикселу. Для форматов pfisbit и pfiebit пикселу соответствуют два байта (в этих 16 битах упакованы данные о трех каналах), pf24bit – три байта (по байту на канал).

Примерно так может выглядеть обработчик события onMouseMove, выводящий на панель состояния информацию о яркости в данной точке (подразумевается, что формат битовой карты – 8 или 24 бита):

procedure TMainForm.ImagelMouseMove(Sender: TObject; SHIFT: TSHIFTState;
X, Y: Integer);
begin
if not Assigned(Imagel. Picture.Bitmap) then Exit;
with Imagel.Picture.Bitmap,
do case PixelFormat of
pfSbit: Statusbarl.SimpleText: = Format('x: %d y: %d b: %d',
[x, y, pByteArray(ScanLine[у])^[x] ]);
pf24bit: Statusbarl.SimpleText: = Format('x: %d y: %d R: %d,G: %d, B: %d',
[x,y, pByteArray(ScanLine[y])л[3*х], pByteArray(ScanLine[у])^[ 3*x+l],
 pByteArray(ScanLine[у])^[ 3*х+2]]);
end;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.