Форум: "Прочее";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
ВнизРисование фигур с антиалиасингом Найти похожие ветки
← →
Gero © (2006-01-12 22:27) [0]Требуется рисовать произвольные отрезки/окружности с антиалиасингом.
Поискал в сети, нашел пару статей и алгоритмов на alglib.sources.ru, но какие-то они некрасивые получаются.
Никто не сталкивался с подобным? Может у кого-то есть какие-то наработки?
Что угодно: код, статьи, краткие описания идеи алгоритма...
← →
Джо © (2006-01-12 22:28) [1]А почему бы не GDI+?
← →
Gero © (2006-01-12 22:30) [2]Не хотелось бы, она не у всех есть. Да и мне кажется, это из пушки по воробьям.
← →
Джо © (2006-01-12 22:33) [3]> [2] Gero © (12.01.06 22:30)
> Не хотелось бы, она не у всех есть.
Библиотека (gdiplus.dll, да это всего один мегабайтный файл) свободно распространяется и работает на операционках начиная с 98. Умельцы даже почти без проблем ставят на 95.
← →
Kantor (2006-01-12 22:35) [4]Graphic Gems в трех томах, там есть описания различных способов сабжа, есть в сети, где-то есть даже реализация описанных там алгоритмов на C.
← →
Gero © (2006-01-12 22:35) [5]> Джо © (12.01.06 22:33)
Может оказаться, что у кого-то не будет. А программа к графике никак не относится, нужно всего-то пару отрезков нарисовать. Не хотелось бы отсеивать потенциальных пользователей из-за такой мелочи.
← →
Kantor (2006-01-12 22:36) [6]Сори, правильно: "Graphics Gems"
← →
Gero © (2006-01-12 22:46) [7]> Kantor (12.01.06 22:35)
Спасибо, буду качать.
← →
antonn © (2006-01-13 06:09) [8]Gero © (12.01.06 22:27)
а на форуме "исходников" смотрел?
← →
antonn © (2006-01-13 06:11) [9]а вообще вот:
procedure Alias(var SourceBitmap:TBitmap; CanvasOut:TCanvas; _R:TRect);
const
MaxPixelCount = MaxInt div SizeOf(TRGBTriple);
type
PRGBArray = ^TRGBArray;
TRGBArray = array[0..MaxPixelCount-1] of TRGBTriple;
var
x,y,cx,cy,cxi,totr,totg,totb,i: Integer;
Row1,Row2,Row3,DestRow: PRGBArray;
begin
for Y:=0 to (SourceBitmap.Height div 3)-1 do begin
cy := y*3;
DestRow := SourceBitmap.ScanLine[y];
Row1:=SourceBitmap.ScanLine[cy];
Row2:=SourceBitmap.ScanLine[cy+1];
Row3:=SourceBitmap.ScanLine[cy+2];
for x := 0 to (SourceBitmap.Width div 3)-1 do begin
cx := x*3;
totr := 0; totg := 0; totb := 0;
for i := 0 to 2 do begin
cxi := cx + i;
totr := totr + Row1[cxi].rgbtRed + Row2[cxi].rgbtRed + Row3[cxi].rgbtRed;
totg := totg + Row1[cxi].rgbtGreen + Row2[cxi].rgbtGreen + Row3[cxi].rgbtGreen;
totb := totb + Row1[cxi].rgbtBlue + Row2[cxi].rgbtBlue + Row3[cxi].rgbtBlue;
end;
DestRow[x].rgbtRed := totr div 9;
DestRow[x].rgbtGreen := totg div 9;
DestRow[x].rgbtBlue := totb div 9;
end;
end;
CanvasOut.CopyRect(_R,SourceBitmap.Canvas,rect(0,0,SourceBitmap.Width div 3,SourceBitmap.Height div 3));
end;
procedure BitmapPrepare(var SourceBitmap:Tbitmap; CanvasOut:TCanvas; _R:TRect);
begin
SourceBitmap.PixelFormat:=pf24bit;
SourceBitmap.Width:=(_r.Right-_r.Left)*3;
SourceBitmap.Height:=(_r.Bottom-_r.Top)*3;
SourceBitmap.Canvas.CopyRect(rect(0,0,SourceBitmap.Width,SourceBitmap.Height),CanvasOut,_R);
end;
использование:
procedure TForm1.Button1Click(Sender: TObject);
var _Bitmap:Tbitmap;
begin
_Bitmap:=TBitmap.Create;
try
BitmapPrepare(_Bitmap,Image1.Picture.Bitmap.Canvas,rect(10,10,200,200)); //берем прямоугольник, в котором будет рисовать
//дальше работаем с _Bitmap.canvas как нам надо
_Bitmap.Canvas.Pen.Width:=3; //устанавливаем толщину в 3 раз больше
_Bitmap.Canvas.Ellipse(20*3,20*3,80*3,80*3);
_Bitmap.Canvas.MoveTo(50*3-1,60*3-1); //все координаты в 3 раза больше (хотя для лучшего эффекта, можно отнять еденицу - будет более смазано и качественно, главное не переборщить:))
_Bitmap.Canvas.LineTo(5*3,15*3);
_Bitmap.Canvas.Brush.Style:=bsclear;
_Bitmap.canvas.Font.Size:=_Bitmap.canvas.Font.Size*3; //тут правда косячно с размером...
_Bitmap.canvas.TextOut(2,2,"Im - super :)");
Alias(_Bitmap,Image1.Picture.Bitmap.Canvas,rect(10,10,200,200)); //вывод
finally
_Bitmap.Free;
end;
end;
(с) antonn
← →
MBo © (2006-01-13 06:49) [10]http://www.antigrain.com/
http://www.simdesign.nl/tips/tip002.html
← →
megabyte-ceercop © (2006-01-13 10:41) [11]Мультисамплинг. Рисуешь на промежуточном битмапе с разрешением в четыре (например в четыре) раза больше без антиальяса и потом попиксельно переносишь на целевую поверхность, уменьшая изображение в четыре раза.
Берешь цвета 16 точек на промежуточной поверхности (квадрат 4х4), вычисляешь для них среднии цвет - это будет цвет для соответствующей точки на целевой поверхности.
Самый правильный способ.
Только не забывай что и лининию на промежуточной поверхности нужно рисовать в четыре раза толще.
← →
Gero © (2006-01-13 13:05) [12]Всем ответившим — спасибо, а особенное спасибо MBo!
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c