Доступ к pf8bit-изображениям осуществляется достаточно легко, с тех пор, как они стали использовать один байт на пиксель. Но вы можете сохранить много памяти, если вам необходим единственный бит на пиксель (как, например, с различными масками) в случае pf1bit-изображения.
Как и в случае с pf8bit-изображениями, используйте TByteArray для доступа к pf1bit-ным линиям чередования (Scanlines). Но для доступа к отдельным пикселям вам понадобиться работать с битами отдельного байта. Так, ширина линии чередования равна Bitmap.Width DIV 8 байт.
Нижеприведенный код показывает как можно создать шаблон 1-битного изображения: черный, белый, полоски, "g", "стрелка" и случайный -- опция "инвертировано" также доступна. (Надеюсь, технологию вы освоете без труда.)
Создайте форму с Image1: для TImage я использую одно изображение Image1 размером 256x256 и свойством Stretch := TRUE, чтобы отдельные пиксели было легко разглядеть. Кнопки Black, White и Stripes имеют свойство tags, c соответствующими значениями 0, 255, и 85 ($55 = 01010101 в двоичной системе исчисления), вызывающие при нажатии обработчик события ButtonStripesClick.
Кнопки "g" и "arrow" имеют собственные обработчики событий, позволяющие корректно распечатать тестовые изображения на принтере HP Laserjet.
"Random" случайным образом устанавливает биты в 1-битном изображении.
"Invert" меняет нули на единички и наоборот.
// Пример того, как использовать Bitmap.Scanline для PixelFormat=pf1Bit. // По просьбе Mino Ballone из Италии. // // Авторское право (C) 1997, Earl F. Glynn, Overland Park, KS. // Все права защищены. // Может свободно использоваться для некоммерческих целей.
var i: INTEGER; j: INTEGER; Row: pByteArray; Value: BYTE; begin
Value := (Sender as TButton).Tag; // Value = $00 = 00000000 в двоичном исчислении для черного // Value = $FF = 11111111 в двоичном исчислении для белого // Value = $55 = 01010101 в двоичном исчислении для черных и белых полос
for j := 0to Bitmap.Height - 1do begin Row := pByteArray(Bitmap.Scanline[j]); for i := 0to (Bitmap.Width div BitsPerPixel) - 1do begin Row[i] := Value end end;
Image1.Picture.Graphic := Bitmap end;
procedure TForm1.ButtonGClick(Sender: TObject);
const {Изображение "g" было адаптировано для печати на принтере LaserJet IIP в соответствии с техническим руководством}
var i: INTEGER; j: INTEGER; Row: pByteArray; begin
for j := 0to Bitmap.Height - 1do begin Row := pByteArray(Bitmap.Scanline[j]); for i := 0to (Bitmap.Width div BitsPerPixel) - 1do begin Row[i] := G[j, i] end end;
var i: INTEGER; j: INTEGER; Row: pByteArray; begin
for j := 0to Bitmap.Height - 1do begin Row := pByteArray(Bitmap.Scanline[j]); for i := 0to (Bitmap.Width div BitsPerPixel) - 1do begin Row[i] := arrow[j, i] end end;
Image1.Picture.Graphic := Bitmap end;
procedure TForm1.FormCreate(Sender: TObject); begin
Bitmap := TBitmap.Create; with Bitmap do begin Width := 32; Height := 32; PixelFormat := pf1bit end; Image1.Picture.Graphic := Bitmap end;
procedure TForm1.FormDestroy(Sender: TObject); begin
var i: INTEGER; j: INTEGER; Row: pByteArray; begin
for j := 0to Bitmap.Height - 1do begin Row := pByteArray(Bitmap.Scanline[j]); for i := 0to (Bitmap.Width div BitsPerPixel) - 1do begin Row[i] := Random(256) end end;
var i: INTEGER; j: INTEGER; Row: pByteArray; begin
for j := 0to Bitmap.Height - 1do begin Row := pByteArray(Bitmap.Scanline[j]); for i := 0to (Bitmap.Width div BitsPerPixel) - 1do begin Row[i] := not Row[i] end end;