Форум: "Начинающим";
Текущий архив: 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