![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как на Bitmap наложить второй bitmap в заданные координаты?
Signal © (2013-12-30 18:22:00)А конкретнее, не по 2 координатам, как в StretchDraw
а по 4-м чтоб можно было задать 4 точки по углам квадрата, чтоб его можно было исказить?
как-то находил такую процедуру, сейчас весь интернет перерыл найти не могу в упор.
Лакримакристи (2014-01-19 03:16:00) [1]Нашёл чуть свободного времени, буду изучать правильно ли там считается альфаканал.
> А для дисторсии не вижу однозначного определения, где-то пишут криволинейное искажение линз, где-то вписывание в четырёхугольник.
Только сейчас это прочёл. Это как раз и берётся полином по четырём точкам и всё. =)
Лакримакристи (2014-01-16 13:27:00) [2]В матрице 3x3 сколько элементов? Видимо девять)
А сколько параметров в функциях SetWorldTransform() и Matrix::SetElements() ? Почему-то шесть. Если бы хотя бы восемь можно было задать... ээх... =(
Signal (2014-01-16 09:51:00) [3]а через FastDib трансформирует правильно
Signal (2014-01-16 09:46:00) [4]>>Sapersky
http://www.sendspace.com/file/hosute
вот пример по рабочим координатам
Signal (2014-01-16 09:19:00) [5]>>Sapersky
Все отлично работает, только блин глюк в Graphic32, при трансформации обрезается с нижних углов пикселей по 10(((( слева и снизу с правого угла
>>Лакримакристи
так а в матрице что должно быть?
Лакримакристи (2014-01-16 05:46:00) [6]Если что вот формула:
x'=(a*x+b*y+c*w)/(g*x+h*y+i*w);
y'=(d*x+e*y+f*w)/(g*x+h*y+i*w);
w обычно берут равным 1.
Лакримакристи (2014-01-16 05:39:00) [7]Это называется "Проекция". Чтоб её сделать нужна матрица 3x3. Хотя вообще есть 2 варианта - проекция и полином4x.
Но стандартными GDI / GDI+ проекция не делается, зазря что теоретически может поддерживать (потому что в описании там заявлена именно матрица 3x3).
Придётся или использовать готовое, или своими руками.
Добавлю что ещё AGG такое поддерживает (причём оба варианта). http://www.antigrain.com/demo/image_perspective.zip
А вот насчёт прозрачности... Интересный вопрос, возможно формула-то изменится на стыках, надо будет подумать, проверить.
Signal (2014-01-07 03:36:00) [8]>>Sapersky
Благодарствую тебя, дружище, если позволишь тебя так назвать
Sapersky (2014-01-07 03:26:00) [9]
> альфа канал, по ходу в bmp есть только в Graphics32
Projective обрабатывает альфа-канал, но TFastDIB.Draw его не отображает. Надо делать MultiplyAlpha (один раз), потом TFastDIB.AlphaDraw.
> Ты по ходу в теме, за 20 баков GD32 запустишь?
Задачки такого уровня вещи могу и бесплатно сделать (если самому интересно).
procedure TForm1.Button1Click(Sender: TObject);
Var b1, b2 : TBitmap32;
proj : TProjectiveTransformation;
samp : TKernelResampler;
begin
b1 := TBitmap32.Create; b1.LoadFromFile('back.bmp');
b2 := TBitmap32.Create; b2.SetSizeFrom(b1);
samp := TKernelResampler.Create(b1);
samp.Kernel := TCubicKernel.Create;
// TBlackmanKernel, TLanczosKernel, etc...
proj := TProjectiveTransformation.Create;
proj.SrcRect := FloatRect(0, 0, b1.Width, b1.Height);
With proj do begin
X0 := 10; Y0 := 10;
X1 := 600; Y1 := 30;
X2 := 7000; Y2 := 4000;
X3 := 20; Y3 := 300;
end;
Transform(b2, b1, proj);
b2.DrawTo(Canvas.Handle, 0, 0);
proj.Free;
b2.Free; b1.Free;
end;
Signal (2014-01-07 02:21:00) [10]если есть желание дам координаты и вообще есть куча работы, есть желание то напиши, дам координаты
Signal (2014-01-07 02:19:00) [11]>>Sapersky
Ты по ходу в теме, за 20 баков GD32 запустишь?
Signal (2014-01-07 02:09:00) [12]>>Sapersky
альфа канал, по ходу в bmp есть только в Graphics32
это я решил другим путем
но Graphics32 так и не смог запустить
еще есть вопрос, создам новую тему
Sapersky (2014-01-04 21:27:00) [13]Насчёт "перевернуть с альфаканалом" - не понял.
По качеству - возможно, фотошоп использует бикубический фильтр. Это к Graphics32, там, как я понял, можно к любой операции прикрутить любой фильтр ценой некоторой потери скорости. В Фастлибе максимум билинейный.
Ну или выложи картинки которые получаются, может по ним скажу точнее.
Signal (2014-01-04 04:01:00) [14]И еще 1 не маловажный момент, в фотошопе куда плавнее переходы идут
Signal (2014-01-04 01:55:00) [15]>>Sapersky
Благодарю, это заработало!
вот только теперь другая проблема, как перевернуть с альфаканалом((--
Sapersky (2014-01-01 03:59:00) [16]Не знаю, у меня тоже с ходу не заработало, а ставить G32 как компонент (чтобы попробовать стандартный пример) не хочется.
Для FastLib пример такой:
//Uses FastDIB, FastSize, Utils;
procedure TForm1.Button1Click(Sender: TObject);
Const Pts : array[0..3] of TRealPoint =
((x: 10; y: 10), (x: 600; y: 30), (x: 700; y: 400), (x: 20; y: 300));
Var fd1, fd2 : TFastDIB;
begin
fd1 := TFastDIB.Create('back.bmp');
fd2 := TFastDIB.Create(fd1);
Projective(fd1, fd2, @Pts, True);
fd2.Draw(Canvas.Handle, 0, 0);
fd2.Free; fd1.Free;
end;
http://sourceforge.net/projects/tfastdib/files/Library/FastDIB%204.0/FastDIB%204.0.zip/download
Signal (2013-12-31 23:41:00) [17]>>Sapersky
>Есть там трансформация по точкам
это я пробовал, не работает в этом варианте
только Skew пашет
а именно по 4-м координатам нет
Sapersky (2013-12-31 23:05:00) [18]Есть там трансформация по точкам:
procedure TFormTranformExample.GenTransform;
begin
if Mode = tmProjective then
begin
ProjectiveTransformation.X0 := Vertices[0].X;
ProjectiveTransformation.Y0 := Vertices[0].Y;
ProjectiveTransformation.X1 := Vertices[1].X;
ProjectiveTransformation.Y1 := Vertices[1].Y;
ProjectiveTransformation.X2 := Vertices[2].X;
ProjectiveTransformation.Y2 := Vertices[2].Y;
ProjectiveTransformation.X3 := Vertices[3].X;
ProjectiveTransformation.Y3 := Vertices[3].Y;
end
else
begin
// affine mode
<...>
procedure TFormTranformExample.DoTransform;
var
i, j: Integer;
begin
GenTransform;
Dst.BeginUpdate;
Dst.Bitmap.Clear($00000000);
Transform(Dst.Bitmap, Src.Bitmap, Transformation);
<...>
Signal (2013-12-31 22:58:00) [19]>>Есть же в комплекте пример, Examples/VCL/Transformation/Transform_Ex
вот в том то и дело, не могу одуплицо, там в примере для TProjectiveTransformation
только варианты искажений skew и для этого соответсвующий класс, а конкретно для каждой точки болт
или я не понимаю ничего, тут до нового года осталось 3 часа времени, 2 часа делать нефиг, может поможешь разобрацо?
с наступающим!!!
Sapersky (2013-12-31 22:52:00) [20]Есть же в комплекте пример, Examples/VCL/Transformation/Transform_Ex.
В FastLib (последней версии) FastSize->Projective, пример TexCube.