Вырезание эллиптической области на BitmapDelphi , Графика и Игры , Bitmap
Автор: Fenik { **** UBPFD *********** by delphibase.endimus.com **** >> Овальная рамка для изображения. Зависимости: Classes, Graphics Автор: Fenik, chook_nu@uraltc.ru, Новоуральск Copyright: Собственное написание (Николай федоровских) Дата: 1 июня 2002 г. ***************************************************** } procedure EllipticBitmap(Bitmap: TBitmap; BackColor: TColor); type TRGB = record B, G, R: Byte; end; pRGB = ^TRGB; var C: TRGB; x, y: Integer; Dest, Src: pRGB; Bmp: TBitmap; begin Bitmap.PixelFormat := pf24Bit; C.R := Lo(BackColor); C.G := Lo(BackColor shr 8); C.B := Lo((BackColor shr 8) shr 8); //создаём дополнительный Bitmap Bmp := TBitmap.Create; try Bmp.Width := Bitmap.Width; Bmp.Height := Bitmap.Height; Bmp.PixelFormat := Bitmap.PixelFormat; //рисуем на созданном Bitmap чёрный эллипс на белом фоне with Bmp.Canvas do begin Brush.Style := bsSolid; Brush.Color := clWhite; FillRect(Rect(0, 0, Bmp.Width, Bmp.Height)); Brush.Color := clBlack; Pen.Style := psClear; Ellipse(Rect(0, 0, Bmp.Width, Bmp.Height)); end; for y := 0 to Bitmap.Height - 1 do begin Src := Bmp.ScanLine[y]; Dest := Bitmap.ScanLine[y]; for x := 0 to Bitmap.Width - 1 do begin //если точка (x, y) на созданном Bitmap белая, //то точку (x, y) на исходном Bitmap закрашиваем BackColor if Src^.r = 255 then Dest^ := C; Inc(Dest); Inc(Src); end; end; finally Bmp.Free; end; end; Пример использования: EllipticBitmap(FBitmap, clWhite); Что это делает
Процедура Как это работает
1. Процедура сначала устанавливает формат пикселей входного растра в 24-бит.
2. Затем она создает новый временный растор ( Предложенные улучшения
1. Код можно оптимизировать, используя одиночный цикл вместо двух вложенных циклов. Это уменьшит количество итераций и улучшит производительность.
2. Код предполагает, что входной растор имеет формат пикселей 24-бит. Если это не так, процедура может потребовать обработки других форматов (например, 16- или 32-бита).
3. Переменная Альтернативное решение Вот альтернативная реализация, использующая одиночный цикл и избегающая копирования целых строк:
В этом решении используется одиночный цикл для итерации по пикселям оригинального растора и проверки, находится ли каждый пиксель внутри эллипса с помощью простой геометрии (т.е., В статье описывается процедура EllipticBitmap для вырезания эллиптической области на Bitmap-образце с помощью рисования чёрного эллипса на белом фоне и последующего замещения соответствующих пикселей исходного образца цветом BackColor. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |