Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
18 / 8 / 17
Регистрация: 22.12.2015
Сообщений: 2,029
1

Как повернуть изображение?

12.04.2016, 19:26. Просмотров 2930. Ответов 10
Метки нет (Все метки)

Замучился искать. Много есть вариантов но они нерабочие, а те, что работают вращают изображение в новом окне, а мне нужно в текущем.Ну как паинте.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2016, 19:26
Ответы с готовыми решениями:

Как повернуть изображение в TBitmap на нужный угол ?
Не хотелось бы считывать байты изображения в массив, пересчитывать их координаты, определять размер...

DSPack повернуть изображение на 90 градусов
Добрый день, подскажите, возможно ли повернуть изображение в VideoWindow на 90 градусов средствами...

Как повернуть изображение на js?
Нужно,чтобы при нажатии на кнопку изображение повернулось на 90 градусов

Как повернуть изображение?
Здравствуйте! Я загружаю Gif изображение в Bitmap и мне нужно чтобы оно поворачивалось по...

10
1699 / 933 / 338
Регистрация: 29.05.2013
Сообщений: 4,356
12.04.2016, 19:38 2
Плохо ищете, практически первая же ссылка на готовую библиотеку в исходниках с примером.
0
Модератор
3467 / 2593 / 738
Регистрация: 19.09.2012
Сообщений: 7,954
12.04.2016, 19:52 3
Поворот изображения по/против часовой стрелке
0
18 / 8 / 17
Регистрация: 22.12.2015
Сообщений: 2,029
12.04.2016, 20:02  [ТС] 4
по и против часовой стрелки поворот идет с новым изображением,а не с текущим.
0
Модератор
3467 / 2593 / 738
Регистрация: 19.09.2012
Сообщений: 7,954
12.04.2016, 20:49 5
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
поворот идет с новым изображением,а не с текущим
Поворот не может идти с текущим.
0
18 / 8 / 17
Регистрация: 22.12.2015
Сообщений: 2,029
12.04.2016, 21:09  [ТС] 6
может.
Выкладыаю полный рабочий код
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls,math, jpeg,Menus, StdCtrls;
type
  { the order of fields must match the BGR order of bytes in memory }
  TMyPixelDescriptor = record
    Blue: Byte;
    Green: Byte;
    Red: Byte;
  end;
 
  PMyPixelArray = ^TMyPixelArray;
  { use an array of 32768 pixels if you want to make sure
    you'll be able to use extra large images sometime in the future }
  TMyPixelArray = array[0..32767] of TMyPixelDescriptor;
 
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N21: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    Image1: TImage;
    N22: TMenuItem;
    procedure N5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N21Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N22Click(Sender: TObject);
    procedure RotateBitmap_ads(SourceBitmap: TBitmap;
          out DestBitmap: TBitmap; Center: TPoint; Angle: Double);
   procedure FlipBitmap(bmap: TBitmap; FlipHor: Boolean);
  private
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
   amount: Integer;
implementation
 
{$R *.dfm}
type
  PixelArray=array [0..32768] of TRGBTriple;
  pPixelArray=^PixelArray;
var
  b: TBitmap;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 
 b:= TBitmap.Create;
 if Screen.Width >= 1024 then
  begin
    ClientWidth := 800;
    ClientHeight := 600;
    Image1.Width:= ClientWidth;
    Image1.Height:= ClientHeight;
  end;
 
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
 
          b.Free;
end;
 
procedure TForm1.N21Click(Sender: TObject);
 var
  p: PMyPixelArray;
  x: Integer;
  y: Integer;
  gray: Integer;
  amount: Integer;
  amount2: Integer;
  amount3: Integer;
begin
        amount := StrToInt(InputBox('red Level',
    'Enter a value from 0 to 100:', '30'));
amount2 := StrToInt(InputBox('green Level',
    'Enter a value from 0 to 100:', '40'));
    amount3 := StrToInt(InputBox('lue Level',
    'Enter a value from 0 to 100:', '50'));
  for y := 0 to Pred(Image1.Picture.Bitmap.Height) do
  begin
 
    p := Image1.Picture.Bitmap.ScanLine[y];
    for x := 0 to Pred(Image1.Picture.Bitmap.Width) do
    with p[x] do
    begin
      gray := (Red * amount + Blue * amount3 + Green * amount2) div 9;
      Blue := gray;
      Red := gray;
      Green := gray;
    end; // with p[x]
  end; // for y
  Invalidate;
 
end;
 
 
 
procedure TForm1.N22Click(Sender: TObject);
var
amo:integer;
begin
             amo := StrToInt(InputBox('Угол поворота',
    'Enter a value from 0 to 360:', '99'));
       RotateBitmap_ads(Image1.Picture.Bitmap,b,Point(Image1.Width div 2,Image1.Height div 2),amo);
  Image1.Canvas.Draw(0,0,b);
end;
 
    procedure TForm1.RotateBitmap_ads(SourceBitmap: TBitmap;
          out DestBitmap: TBitmap; Center: TPoint; Angle: Double);
var
  cosRadians : Double;
  inX : Integer;
  inXOriginal : Integer;
  inXPrime : Integer;
  inXPrimeRotated : Integer;
  inY : Integer;
  inYOriginal : Integer;
  inYPrime : Integer;
  inYPrimeRotated : Integer;
  OriginalRow : pPixelArray;
  Radians : Double;
  RotatedRow : pPixelArray;
  sinRadians : Double;
begin
  DestBitmap.Width := SourceBitmap.Width;
  DestBitmap.Height := SourceBitmap.Height;
  DestBitmap.PixelFormat := pf24bit;
  Radians := -(Angle) * PI / 180;
  sinRadians := Sin(Radians);
  cosRadians := Cos(Radians);
  for inX := DestBitmap.Height-1 downto 0 do
  begin
    RotatedRow := DestBitmap.Scanline[inX];
    inXPrime := 2*(inX - Center.y) + 1;
    for inY := DestBitmap.Width-1 downto 0 do
    begin
      inYPrime := 2*(inY - Center.x) + 1;
      inYPrimeRotated := Round(inYPrime * CosRadians - inXPrime * sinRadians);
      inXPrimeRotated := Round(inYPrime * sinRadians + inXPrime * cosRadians);
      inYOriginal := (inYPrimeRotated - 1) div 2 + Center.x;
      inXOriginal := (inXPrimeRotated - 1) div 2 + Center.y;
      if (inYOriginal >= 0) and (inYOriginal <= SourceBitmap.Width-1) and
      (inXOriginal >= 0) and (inXOriginal <= SourceBitmap.Height-1) then
      begin
        OriginalRow := SourceBitmap.Scanline[inXOriginal];
        RotatedRow[inY] := OriginalRow[inYOriginal];
      end
      else
      begin
        RotatedRow[inY].rgbtBlue := 255;
        RotatedRow[inY].rgbtGreen := 0;
        RotatedRow[inY].rgbtRed := 0
      end;
    end;
  end;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
              if OpenDialog1.Execute then
  begin
             Image1.Picture.LoadFromFile(OpenDialog1.FileName);
 
    { always treat the bitmap as a 24bit bitmap }
    Image1.Picture.Bitmap.PixelFormat := pf24bit;
    Invalidate; { Display the image }
   end;
end;
 
 
procedure TForm1.N4Click(Sender: TObject);
begin
         if SaveDialog1.Execute then
          Image1.Picture.Bitmap.SaveToFile(SaveDialog1.FileName);
end;
 
procedure TForm1.N5Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.N6Click(Sender: TObject);
begin
       FlipBitmap(Image1.Picture.Bitmap,True); //отражение по горизонтали
        Invalidate;
end;
 
 
   procedure TForm1.N7Click(Sender: TObject);
begin
       FlipBitmap(Image1.Picture.Bitmap,False); //отражение по вертикали
      Invalidate;
end;
 
procedure TForm1.FlipBitmap(bmap: TBitmap; FlipHor: Boolean);
var
  x, y, W, H: Integer;
  Pixel_1, Pixel_2: PRGBTriple;
  MemPixel: TRGBTriple;
begin
  bmap.PixelFormat := pf24Bit;
  W := bmap.Width - 1;
  H := bmap.Height - 1;
  if FlipHor then
    for y := 0 to H do
    begin
       Pixel_1 := bmap.ScanLine[y];
      Pixel_2 := bmap.ScanLine[y];
       Inc(Pixel_2, W);
       for x := 0 to W div 2 do
      begin
         MemPixel := Pixel_1^;
        Pixel_1^ := Pixel_2^;
        Pixel_2^ := MemPixel;
        Inc(Pixel_1);
        Dec(Pixel_2);
      end;
    end  else
    for y := 0 to H div 2 do
    begin
      Pixel_1 := bmap.ScanLine[y];
      Pixel_2 := bmap.ScanLine[H - y];
      for x := 0 to W do
      begin
         MemPixel := Pixel_1^;
        Pixel_1^ := Pixel_2^;
        Pixel_2^ := MemPixel;
        Inc(Pixel_1);
        Inc(Pixel_2);
      end;
    end;
end;
end.
0
Пишу на Delphi...иногда
1417 / 1275 / 285
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
12.04.2016, 21:16 7
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
может.
и где в приведенном коде поворачивается текущее изображение?
RotateBitmap_ads(Image1.Picture.Bitmap,b
Image1.Canvas.Draw(0,0,b); передается исходное изображение, получается повернутое, потом повернутое изображение выводится поверх исходного
0
18 / 8 / 17
Регистрация: 22.12.2015
Сообщений: 2,029
12.04.2016, 22:31  [ТС] 8
Да все верно.
Подскажите как эти шумы реализовать
на изображении:
1. «Соль и перец»: случайные черные и белые пиксели.
2. Импульсный: случайные белые пиксели.
3. Гауссов: колебания яркости, распределенные по нормальному закону.

Добавлено через 47 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm2.N7Click(Sender: TObject);
var i,j,t,m:integer;
begin
       for i:=0 to Image1.Width-1 do
  for j:=0 to Image1.Height-1 do
if Image1.Canvas.Pixels[i,j]<>Random(255)then
  Image1.Canvas.Pixels[Random(i),Random(j)]:=$FFFFFF;//случайные белые точки
 
end;
 
procedure TForm2.N8Click(Sender: TObject);
var i,j,t,m:integer;
begin
       for i:=0 to Image1.Width-1 do
  for j:=0 to Image1.Height-1 do
 if Image1.Canvas.Pixels[i,j]<>Random(255) then
  Image1.Canvas.Pixels[Random(i),Random(j)]:=$000000;//случайные черные точки
end;
0
Модератор
3467 / 2593 / 738
Регистрация: 19.09.2012
Сообщений: 7,954
12.04.2016, 22:37 9
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
случайные белые точки
Условие сам придумал?)
0
18 / 8 / 17
Регистрация: 22.12.2015
Сообщений: 2,029
12.04.2016, 23:45  [ТС] 10
правильно так
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm2.xn1Click(Sender: TObject);
var
 I, X, Y: Integer;
begin
            for I := 1 to 100 do
    begin
      X := Random (Image1.Width);
      Y := Random (Image1.Height);
      Image1.Canvas.Pixels [X, Y] := ClBlack; // Случайные точки становятся чёрными
    end;
end;
Добавлено через 31 секунду
Помогите реализоать простейший
Медианный фильтр реализует нелинейную процедуру подавления шумов.
Медианный фильтр - скользящее по изображению окно W, охватывающее нечетное число пикселей.
Цвет текущего пикселя заменяется медианой цветов всех пикселей изображения, попавших в окно (средний по порядку элемент в упорядоченной последовательности пикселей окна).
Характерная особенность медианного фильтра - сохранение перепадов яркости (контуров).
0
Модератор
3467 / 2593 / 738
Регистрация: 19.09.2012
Сообщений: 7,954
13.04.2016, 09:24 11
Алгоритм работы фильтра можно взять тут: 2D Медианный фильтр
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2016, 09:24

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

Как повернуть изображение
Имеется объект типа QImage, мне требуется его повернуть. Вот код #include &quot;mainwindow.h&quot;...

Как повернуть изображение?
Вотъ код, но он чего-то не работает , ошибок нет, просто не выполняет поворот изображения...

Как повернуть изображение на форме?
Image img=Resources.Image1;

Как повернуть текст и изображение на image?
Подскажите, пожалуйста! Как выводить текст повернутый (на image)на угол, который я указал в поле...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.