Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.02.22;
Скачать: [xml.tar.bz2];

Вниз

как на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.002 c
15-1405369802
Юрий
2014-07-15 00:30
2015.02.22
С днем рождения ! 15 июля 2014 вторник


15-1402987185
ВладОшин
2014-06-17 10:39
2015.02.22
Глючит роутер.


11-1258441577
Dy1
2009-11-17 10:06
2015.02.22
апи Windows 7


2-1390291002
AlexDn
2014-01-21 11:56
2015.02.22
Запуск странички


15-1405758522
oldman
2014-07-19 12:28
2015.02.22
Юмор Шрёдингера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский