Bitmap.Scanline для PixelFormat
Хтось із Італії попросив мене приклад використання pf1bit в зображеннях (Bitmaps), я послав часто відповіді з наявних заготовок, подумав, і додав тут інші деталі для pf8bit і pf24bit.
Нове в Delphi 3 властивість scanline допускає швидкий доступ до окремих пикселям, але необхідно вказати з яким Bitmap.PixelFormat ви працюєте, перш ніж зможете мати доступ до пікселів.
Можливі PixelFormats включають:- pfDevice
- pf1bit
- pf4bit
- pf8bit
- pf15bit
- pf16bit
- pf24bit
- pf32bit
Для pf24bit-зображень необхідно визначити:
Примітка: TRGBTriple визначено в модулі Windows.PAS.
Для того, щоб до існуючого 24-бітного зображення мати доступ як до зображення, створеного з дозволом 3 байта на піксель, зробіть наступне:
Доступ до такого формату зображення легко отримати, використовуючи TByteArray (визначено в SysUtils.PAS):
(Я думаю (але сам цього не пробував), що ви зможете отримати доступ до pf16bit-зображень, використовуючи такі визначення в SysUtils.PAS:
Для того, щоб обробити 8-бітове (pf8bit) зображення, використовуйте конструктор подібний цьому, який створює гістограму зображення:
Доступ до 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" змінює нулі на одиниці і навпаки.