![]() |
![]() ![]() ![]() ![]() |
|
Вырезание эллиптической области на 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 прямо в свой смартфон. Подпишитесь на наш
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||