Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.02.22;
Скачать: CL | DM;

Вниз

как на Bitmap наложить второй bitmap в заданные координаты?   Найти похожие ветки 

 
Signal   (2013-12-30 18:22) [0]

А конкретнее, не по 2 координатам, как в StretchDraw
а по 4-м чтоб можно было задать 4 точки по углам квадрата, чтоб его можно было исказить?
как-то находил такую процедуру, сейчас весь интернет перерыл найти не могу в упор.


 
Rouse_ ©   (2013-12-30 19:06) [1]


> сейчас весь интернет перерыл найти не могу в упор.

Прямо таки и весь? :) Уважаю, даж гугль снимает перед тобой шляпу.
Попробую поискать в другом интернете, там смотри что есть: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145120(v=vs.85).aspx


 
Signal   (2013-12-30 19:34) [2]

Это я и сам видел, но это не то, тоже самое что и StretchDraw


 
DVM ©   (2013-12-30 19:41) [3]


> Signal  

SetWorldTransform


 
Signal   (2013-12-30 19:59) [4]

>DVM

Это тоже не то, там поворт на угол, а у меня может быть каждые 4-е координаты по осям могут тоже быть разными
например, в виде трапеции.


 
Rouse_ ©   (2013-12-30 19:59) [5]


> Signal   (30.12.13 19:34) [2]
> Это я и сам видел, но это не то, тоже самое что и StretchDraw

Ага, понятно. Т.е. тебе нужно как в StretchDraw, но по 4 точкам? :))


 
Rouse_ ©   (2013-12-30 20:02) [6]


> Signal   (30.12.13 19:59) [4]
> >DVM
>
> Это тоже не то, там поворт на угол, а у меня может быть
> каждые 4-е координаты по осям могут тоже быть разными
> например, в виде трапеции.

Ага, ну теперь понятно (умеешь же ты обьяснять :) - эт тебе в сторону GDI+ смотреть нужно.


 
DVM ©   (2013-12-30 20:05) [7]


> Signal   (30.12.13 19:59) [4]


> Это тоже не то, там поворт на угол, а у меня может быть
> каждые 4-е координаты по осям могут тоже быть разными
> например, в виде трапеции.

SetWorldTransform - это сдвиг, поворот, деформация одновременно + независимая по двум осям.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd145104(v=vs.85).aspx


The SetWorldTransform function sets a two-dimensional linear transformation between world space and page space for the specified device context. This transformation can be used to scale, rotate, shear, or translate graphics output.


 
DVM ©   (2013-12-30 20:10) [8]


> Signal

Если тебе нужна вообще произвольная деформация, то это нелинейная трансформация будет.


 
DVM ©   (2013-12-30 20:19) [9]


> Signal

http://www.codeproject.com/Articles/247214/Quadrilateral-Distortion

вот тут про дисторсию - это как раз твой случай


 
Sapersky   (2013-12-30 22:03) [10]

Сторонние библиотеки - Graphics32, FastLib.
Если есть жёсткие требования по скорости, можно делать через аппаратную графику (DX/OGL), накладывать текстуру на два треугольника.


 
DVM ©   (2013-12-30 22:40) [11]


> Sapersky


> FastLib.

там есть дисторсия?


 
Sapersky   (2013-12-31 00:34) [12]

Есть вписывание картинки в произвольный четырёхугольник, в G32 это называется Perspective transform. Фактически в FastLib копипаст G32, но оптимизированный.
А для дисторсии не вижу однозначного определения, где-то пишут криволинейное искажение линз, где-то вписывание в четырёхугольник.


 
Signal   (2013-12-31 01:21) [13]

Благодарствую, Sapersky
в FastLib не нашел, что нужно, а в Graphics32 это TProjectiveTransformation


 
Германн ©   (2013-12-31 03:53) [14]


> DVM ©   (30.12.13 20:19) [9]
> вот тут про дисторсию

Не ну Дим. При чём тут дисторсия?


 
Signal   (2013-12-31 22:21) [15]

>Sapersky
>>Благодарствую, Sapersky
>>в FastLib не нашел, что нужно, а в Graphics32 это TProjectiveTransformation

что-то вообще я в ступоре, никак не могу раздуплить как его использовать-то
мучал не перемучал

с наступающим всех


 
Signal   (2013-12-31 22:30) [16]

может есть примеры какие? именно для
TProjectiveTransformation


 
Sapersky   (2013-12-31 22:52) [17]

Есть же в комплекте пример, Examples/VCL/Transformation/Transform_Ex.

В FastLib (последней версии) FastSize->Projective, пример TexCube.


 
Signal   (2013-12-31 22:58) [18]

>>Есть же в комплекте пример, Examples/VCL/Transformation/Transform_Ex

вот в том то и дело, не могу одуплицо, там в примере для TProjectiveTransformation
только варианты искажений skew и для этого соответсвующий класс, а конкретно для каждой точки болт
или я не понимаю ничего, тут до нового года осталось 3 часа времени, 2 часа делать нефиг, может поможешь разобрацо?
с наступающим!!!


 
Sapersky   (2013-12-31 23:05) [19]

Есть там трансформация по точкам:

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 23:41) [20]

>>Sapersky  

>Есть там трансформация по точкам

это я пробовал, не работает в этом варианте
только Skew пашет
а именно по 4-м координатам нет


 
Sapersky   (2014-01-01 03:59) [21]

Не знаю, у меня тоже с ходу не заработало, а ставить 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   (2014-01-04 01:55) [22]

>>Sapersky

Благодарю, это заработало!
вот только теперь другая проблема, как перевернуть с альфаканалом((--


 
Signal   (2014-01-04 04:01) [23]

И еще 1 не маловажный момент, в фотошопе куда плавнее переходы идут


 
Sapersky   (2014-01-04 21:27) [24]

Насчёт "перевернуть с альфаканалом" - не понял.
По качеству - возможно, фотошоп использует бикубический фильтр. Это к Graphics32, там, как я понял, можно к любой операции прикрутить любой фильтр ценой некоторой потери скорости. В Фастлибе максимум билинейный.
Ну или выложи картинки которые получаются, может по ним скажу точнее.


 
Signal   (2014-01-07 02:09) [25]

>>Sapersky

альфа канал, по ходу в bmp есть только в Graphics32
это я решил другим путем
но Graphics32 так и не смог запустить

еще есть вопрос, создам новую тему


 
Signal   (2014-01-07 02:19) [26]

>>Sapersky

Ты по ходу в теме, за 20 баков GD32 запустишь?


 
Signal   (2014-01-07 02:21) [27]

если есть желание дам координаты и вообще есть куча работы, есть желание то напиши, дам координаты


 
Sapersky   (2014-01-07 03:26) [28]


> альфа канал, по ходу в 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 03:36) [29]

>>Sapersky

Благодарствую тебя, дружище, если позволишь тебя так назвать


 
Лакримакристи   (2014-01-16 05:39) [30]

Это называется "Проекция". Чтоб её сделать нужна матрица 3x3. Хотя вообще есть 2 варианта - проекция и полином4x.
Но стандартными GDI / GDI+ проекция не делается, зазря что теоретически может поддерживать (потому что в описании там заявлена именно матрица 3x3).
Придётся или использовать готовое, или своими руками.
Добавлю что ещё AGG такое поддерживает (причём оба варианта). http://www.antigrain.com/demo/image_perspective.zip

А вот насчёт прозрачности... Интересный вопрос, возможно формула-то изменится на стыках, надо будет подумать, проверить.


 
Лакримакристи   (2014-01-16 05:46) [31]

Если что вот формула:

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.


 
Signal   (2014-01-16 09:19) [32]

>>Sapersky

Все отлично работает, только блин глюк в Graphic32, при трансформации обрезается с нижних углов пикселей по 10(((( слева и снизу с правого угла

>>Лакримакристи  

так а в матрице что должно быть?


 
Signal   (2014-01-16 09:46) [33]

>>Sapersky
http://www.sendspace.com/file/hosute

вот пример по рабочим координатам


 
Signal   (2014-01-16 09:51) [34]

а через FastDib трансформирует правильно


 
Лакримакристи   (2014-01-16 13:27) [35]

В матрице 3x3 сколько элементов? Видимо девять)
А сколько параметров в функциях SetWorldTransform() и Matrix::SetElements() ? Почему-то шесть. Если бы хотя бы восемь можно было задать... ээх... =(


 
Лакримакристи   (2014-01-19 03:16) [36]

Нашёл чуть свободного времени, буду изучать правильно ли там считается альфаканал.

> А для дисторсии не вижу однозначного определения, где-то пишут криволинейное искажение линз, где-то вписывание в четырёхугольник.

Только сейчас это прочёл. Это как раз и берётся полином по четырём точкам и всё. =)



Страницы: 1 вся ветка

Текущий архив: 2015.02.22;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.007 c
15-1405528850
Разведка
2014-07-16 20:40
2015.02.22
Ищу работу программистом Delphi по городу СПб


15-1405369802
Юрий
2014-07-15 00:30
2015.02.22
С днем рождения ! 15 июля 2014 вторник


2-1389977443
Jimmy
2014-01-17 20:50
2015.02.22
Мерцание TImage при Gif-анимации


15-1405542603
Юрий
2014-07-17 00:30
2015.02.22
С днем рождения ! 17 июля 2014 четверг


2-1389248246
ВладОшин
2014-01-09 10:17
2015.02.22
Фокус TWebBrowser