Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
1

Вращение изображения

19.04.2016, 02:01. Показов 7025. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть ли какой то компонент в который можно было бы загрузить изображение и вращать его?
к примеру если не ошибаюсь то в FMX у большинства компонентов есть такое свойство RotationAngl... но о своих проблемах с фмх(из-за которых работать с ним практически невозможно(( ) я уже писал, и решение так и не было найдено(((
Желательно поддержка прозрачности..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2016, 02:01
Ответы с готовыми решениями:

Вращение изображения через матрицу преобразования
Здравствуйте, прошу помощи с Delphi. Нужно сделать рисунок, одной из функций которого будет...

Вращение стрелки
вот тут при последовательном вводе в едит1 координаты y и в едит2 координаты x: 150 и 50 ; 125 и 75...

Вращение линии
Помогите создать программу в DELPHI7.Вращение линии во круг своей оси по часовой стрелке с...

Вращение звезды
Здравствуйте! Вот есть программа рисования звезды на правую/левую кнопку мыши. Как сделать так,...

15
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
19.04.2016, 06:33 2
Так елементов или изображений? FMX или GDI+ или GDI32?
0
5785 / 4527 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
19.04.2016, 07:56 3
посмотрел тот пост
таскание элементов по форме вещь не очень понятная
у меня перемещение чего попало куда угодно не лагает и не оставляет следов...
возможно, проблема будет, если таскать сами компоненты FMX, ибо там и свистелок и перделок для кросс-платформы куча большая.
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
19.04.2016, 08:09 4
Лучший ответ Сообщение было отмечено CheshireesCat как решение

Решение

Компонент "RotateImage".
Например, я его устанавливал так: выбрал в меню "Component\Install Component" и выбрал файл "RotImgReg.pas", далее реагировал на сообщения и на вкладке "Delphi Area" появился компонент "RotateImage".
У него есть свойство Angle, в котором задаётся угол поворота в градусах.
Изменял угол поворота по таймеру. Поставил интервал таймера на 100 миллисекунд. После добавления в "procedure TForm1.FormCreate(Sender: TObject);" строки "doublebuffered:=true;" изображение поворачивалось без искажений с большой скоростью.
Прилагаю проект компонента "RotateImage".
Вложения
Тип файла: zip rotateimage.zip (29.1 Кб, 184 просмотров)
1
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
19.04.2016, 08:17 5
При установке свойства "UniqueSize" равным "false", размер компонента можно уменьшить до размера загруженного в него изображения. Если свойство "UniqueSize" равно "true", размер компонента увеличивается так, что при повороте видно всё загруженное в него изображение.
1
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
19.04.2016, 15:41  [ТС] 6
Цитата Сообщение от BOGG ART Посмотреть сообщение
Так элементов или изображений? FMX или GDI+ или GDI32?
мне надо вращать или изображение или элемент в котором оно, делать это в VCL

Добавлено через 4 минуты
Цитата Сообщение от unifikator Посмотреть сообщение
Компонент "RotateImage".
после установки проект запускается чтобы установить компонент и выдаёт ошибки, допустим с библиотеками я решил ошибки дописав перед некоторыми vcl. Вроде установился, пойду проверять

Добавлено через 2 минуты
krapotkin, изза этого практически невозможно нормально построить внешний вид формы, изза этих миганий всего и везде..
0
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
19.04.2016, 16:03 7
На GDI32:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Procedure TForm1.DrawRotated(C: TCanvas; G: TGraphic; Const X0, Y0: Integer; Const AngleRad: Single = 0; Const Dx: Single = 0; Const Dy: Single = 0);
Var XF: TXForm;
Begin
XF.eM11:=1;
XF.eM12:=0;
XF.eM21:=0;
XF.eM22:=1;
XF.eDx:=-X0-Dx;
XF.eDy:=-Y0-Dy;
SetWorldTransform(C.Handle, XF);
XF.eM11:=Cos(AngleRad);
XF.eM12:=Sin(AngleRad);
XF.eM21:=-Sin(AngleRad);
XF.eM22:=Cos(AngleRad);
XF.eDx:=0;
XF.eDy:=0;
ModifyWorldTransform(C.Handle, XF, MWT_RIGHTMULTIPLY);
XF.eM11:=1;
XF.eM12:=0;
XF.eM21:=0;
XF.eM22:=1;
XF.eDx:=X0+Dx;
XF.eDy:=Y0+Dy;
ModifyWorldTransform(C.Handle, XF, MWT_RIGHTMULTIPLY);
C.Draw(X0, Y0, G);
ModifyWorldTransform(C.Handle, XF, MWT_IDENTITY);
End;
На GDI+ будет покачественнее, и приблизительно также, но сходу не нашёл.
А тот модуль как я понял создаёт дубликат картинки, крутит его пиксели по формулам.
1
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
19.04.2016, 16:23  [ТС] 8
unifikator, [dcc32 Fatal Error] Unit1.pas(7): F1026 File not found: 'D:\users\Cheshirees\Документы\Embarcadero\Studio\Projects\RotImg.dcu'

Добавлено через 3 минуты
Цитата Сообщение от BOGG ART Посмотреть сообщение
GDI32
никогда не слышал ни о GDI32 ни о GDI+
сейчас читаю материал

Добавлено через 2 минуты
" представляет собой интерфейс, который Windows использует для рисования 2D графики. Также это самый медленный способ отображения графики из существующих"
0
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
19.04.2016, 16:33 9
Это не так. Все окна рисуются на GDI. Всё что есть на экране кроме оверлеев рисует GDI. Было бы это медленно - никто бы не покупал винду.
Неоптимально - это да. GDI32 - первая, старая, полностью на процессоре. GDI+ где-то с XP штоле появилась, частично слегка задействует DirectX. Качественнее изображение (при растягивании или поворотах например).

Так дайте ему этот файл! С:
0
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
19.04.2016, 16:36  [ТС] 10
Цитата Сообщение от BOGG ART Посмотреть сообщение
Так дайте ему этот файл!
так нет его в архиве)

Добавлено через 37 секунд
сейчас читаю о Graphics32
0
500 / 356 / 231
Регистрация: 29.03.2015
Сообщений: 675
19.04.2016, 16:45 11
Инсталляция компонента.

1. Распаковал "rotateimage.zip" в папку "rotateimage".
2. В Delphi выбрал в меню "File\Close All".
3. Выбрал в меню "Component\Install Component...".
4. Напротив "Unit file name:" нажал кнопку "Browse".
5. Зашёл в папку "rotateimage" и открыл файл "RotImgReg.pas".
6. Нажал кнопку "OK".
7. На вопрос "Continue?" нажал кнопку "Yes".
8. На сообщение о регистрации компонента нажал кнопку "OK".
9. Выбрал в меню "File\Save All".
10. Выбрал в меню "File\Close All".

Создание приложения.

1. В Delphi выбрал в меню "File\New\Application".
2. На палитре "Delphi Area" дважды нажал "Rotate Image".

Никаких ошибок замечено не было!
0
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
19.04.2016, 17:08  [ТС] 12
unifikator, в общем эту проблему решил, во первых закинул RotImg.pas в проект а во вторых закомментировал в нём строку
Delphi
1
//{$I DELPHIAREA.INC}
0
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
19.04.2016, 17:24 13
оу... Он должен был видимо скомпилиться... А если такой же pas в папку проекта?

GDI32 - базовое для Windows, даже самых древних.
GDI+ (GDIP) - улучшенное для Windows, шаг выше в качестве, добавлена поддержка полупрозрачности.
Они встроены в ОС, они есьм основное API. Всё остальное - поделки разных профи и не очень.
Дальше только OpenGL и DirectX - они молотят на видеокарте и по трём координатам.
0
88 / 84 / 43
Регистрация: 02.05.2015
Сообщений: 766
19.04.2016, 17:26  [ТС] 14
BOGG ART, да из тог что я прочитал, она(библиотека?) в целом более чем удовлетворит мои потребности.. но как её правильно подключать и работать с ней?
0
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
19.04.2016, 18:47 15
Лучший ответ Сообщение было отмечено CheshireesCat как решение

Решение

GDI32 всегда доступна в Win-проекте, оно в Winapi.Windows. И всякие Canvas.* переадресовываются туды.
GDI+ должен быть в каком-нить Winapi.GDIPAPI и Winapi.GDIPOBJ.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.Imaging.pngimage, Vcl.ExtCtrls, Math,
  Winapi.GDIPAPI, Winapi.GDIPOBJ;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    I: GpBitmap;
    Ang: Integer;
    Procedure DrawRotated(G: GpGraphics; Const X0, Y0: Integer; Const Angle: Single = 0; Const Dx: Single = 0; Const Dy: Single = 0);
  public
    { Public declarations }
  end;
 
Var Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var S: TMemoryStream; A: TStreamAdapter;
begin
DoubleBuffered:=True;
S:=TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(S); // Сами добавьте проверки чтоб там что-то было
A:=TStreamAdapter.Create(S, soReference); // Не знаю что за магия, тока что нагуглил
S.Seek(0, soFromBeginning);
GdipCreateBitmapFromStream(A, I); // Но из S грузить не хотело, а только из некоего адаптера грузит
// A.Free; // Удаляться не хочет, но возможно GDI+ сам почистит
S.Free;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
// GdipimaDisposeImage(I); // Почему-то вылетает, может перепутал функцию или хз что
end;
 
procedure TForm1.FormPaint(Sender: TObject);
var G: GpGraphics;
begin
Canvas.Lock;
GdipCreateFromHDC(Canvas.Handle, G);
// GdipSetInterpolationMode(G, InterpolationModeNearestNeighbor); // Рисовать с низким качеством - как у GDI32
DrawRotated(G, 160, 140, Ang, Image1.Picture.Graphic.Width/2, Image1.Picture.Graphic.Height/2);
GdipDeleteGraphics(G);
Canvas.Unlock;
end;
 
procedure TForm1.DrawRotated(G: GpGraphics; Const X0, Y0: Integer; Const Angle: Single = 0; Const Dx: Single = 0; Const Dy: Single = 0);
begin
GdipTranslateWorldTransform(G, -X0-Dx, -Y0-Dy, MatrixOrderAppend);
GdipRotateWorldTransform(G, Angle, MatrixOrderAppend);
GdipTranslateWorldTransform(G, X0+Dx, Y0+Dy, MatrixOrderAppend);
GdipDrawImageI(G, I, X0, Y0);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc(Ang, 2);
Repaint;
end;
 
end.
1
0 / 0 / 1
Регистрация: 21.01.2021
Сообщений: 181
22.01.2021, 12:24 16
Добрый день!

Установил компонент TRotateImage. Загрузил в него фото, повернул на 90 градусов. А как теперь скопировать это полученное фото? через буфер не получается, возвращает исходный угол. А нужна фотка именно повернутая
0
22.01.2021, 12:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2021, 12:24
Помогаю со студенческими работами здесь

Вращение треугольника
Если кто то делал подобное, подскажите процедуру вращение треугольника. Файл что хочу получить...

Вращение отрезка
Подскажите как осуществить вращение отрезка по градусам вокруг начальной точки (MoveTo(40,100)),...

вращение фигуры
Написать процедуру вращения фигуры вокруг цента.Форму фигуры задать процедурным типом.Показать...

Вращение куба
Здравствуйте, помогите мне очень быстро, пожалуйста, как создать вращение куба, хочу его повернуть,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru