Класс TBitmap
Само значение свойства ScanLine изменить нельзя (оно доступно только для чтения). Но можно изменить данные, на которые оно указывает. Вот так можно получить негатив 24-битной картинки:
Var line: pByteArray; For i: = 0 to Imagel.Picture.Bitmap.Height -1 do Begin Line: = Imagel.Picture.Bitmap.ScanLine[i]; For j: = 0 to Imagel.Picture.Bitmap.Width * 3-1 do Line^[j]: = 255 -Line^[j]; End;
Если вы хотите решать более серьезные задачи – на уровне профессиональных средств – на помощь может прийти библиотека обработки изображений фирмы Intel (Intel Image Processing Library). Этот набор инструментов позволяет разработчику включать в программы алгоритмы обработки изображений, написанные и оптимизированные специально для процессоров фирмы Intel. Библиотека является свободно распространяемой, и последняя ее версия располагается на Web-сайте фирмы. Интерфейсы к функциям библиотеки для Delphi разработаны авторами этой книги и вместе с примерами находятся на прилагаемой к книге дискете.
Примечание
В Delphi можно столкнуться с "тезкой" рассматриваемого объекта – структурой TBitmap, описанной в файле WINDOWS.PAS. Поскольку обе они относятся к одной и той же предметной области, часто возникают коллизии, приводящие к ошибкам. Напомним, чтобы отличить структуры-синонимы, следует использовать имя модуля, в котором они описаны. Поэтому если в вашей программе есть модули Windows и Graphics, то описывайте и употребляйте типы Windows.TBitmap и Graphics.TBitmap.
В состав Windows входят карточные игры (точнее, пасьянсы), которые черпают ресурсы из динамической библиотеки cards.dll. Если вы откроете эту библиотеку в редакторе ресурсов, то увидите там изображения всех пятидесяти двух карт и десятка вариантов их рубашек (оборотных сторон). Используем эту возможность для рисования карт. Так загружается битовая карта для рубашки:
var CardsDll: THandle; BackBitmap: Graphics.TBitmap; initialization CardsDll: = LoadLibraryEx('cards.dll',0, LOAD_LIBRARY__AS_DATAFILE); BackBitmap: = Graphics.TBitmap.Create; BackBitmap.LoadFromResourcelD(CardsDll, 64); finalization BackBitmap.Free; FreeLibrary(CardsDll); end.
Примечание
В Windows 95/98 эта динамическая библиотека – 16-разрядная, и работать так, как описано, не будет. Используйте библиотеку Cards.dll из состава Windows NT, 2000.
Аналогичным образом можно загрузить битовые карты для всей колоды. При показе карты, в зависимости от того, открыта она или закрыта, отрисовывается один из объектов TBitmap:
if Known then // карта открыта Canvas.StretchDraw(ClientRect, FaceBitmap) else Canvas.StretchDraw(ClientRect,BackBitmap) end;