Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо