Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2021, 00:48   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию Повернуть изображение и изменить атрибуты файла

Собственно задача такая:

1. Скопировать атрибуты файлы (а конкретнее - дата изменения)
2. Повернуть изображение на 90 градусов
3. Вернуть новому файлу атрибут (дату изменения) старого
Kronos913 вне форума Ответить с цитированием
Старый 22.02.2021, 02:55   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Очень интересно нафига нужно такое извращение?
northener вне форума Ответить с цитированием
Старый 22.02.2021, 16:01   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Потому что мне надо видеть, когда фотка была добавлена в базу - потому не очень, когда у нее при редактировании меняются атрибуты

И в то же время, надо повернуть фотку, которая боком в нормальное положение
Kronos913 вне форума Ответить с цитированием
Старый 22.02.2021, 16:33   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Задача №1
Задача №2 - прикреплённый файл (найдено в сети интернет).
Вложения
Тип файла: zip Поворот изображения.zip (407.8 Кб, 10 просмотров)

Последний раз редактировалось Shouldercannon; 22.02.2021 в 16:38.
Shouldercannon вне форума Ответить с цитированием
Старый 22.02.2021, 22:17   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Задача №1
Задача №2 - прикреплённый файл (найдено в сети интернет).
По второй задаче: может быть для 90 градусов есть более простой алгоритм какой-то?
Kronos913 вне форума Ответить с цитированием
Старый 18.03.2021, 17:47   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

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

Эксперименты проведены на все три варианта поворота + с двумя вариантами изображений: горизонтальными и вертикальными. Все работает

Код:
procedure RotateBitmap_ads(SourceBitmap: TBitmap;
          out DestBitmap: TBitmap; Angle10: ShortInt);
type
  PixelArray=array [0..32768] of TRGBTriple;
  pPixelArray=^PixelArray;


Const
  Angle: array [-1..1] of integer = (-90, 180, 90);

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;

  Center: TPoint;

begin

  case Angle10 of
            -1: begin
                 DestBitmap.Height := SourceBitmap.Width;
                 DestBitmap.Width := SourceBitmap.Height;
                 Center.X:= SourceBitmap.Width div 2;
                 Center.Y:= SourceBitmap.Width div 2;
                end;
             0: begin
                 DestBitmap.Width := SourceBitmap.Width;
                 DestBitmap.Height := SourceBitmap.Height;
                 Center.X:= DestBitmap.Width div 2;
                 Center.Y:= DestBitmap.Height div 2;
                end;
             1: begin
                 DestBitmap.Height := SourceBitmap.Width;
                 DestBitmap.Width := SourceBitmap.Height;
                 Center.X:= SourceBitmap.Height div 2;
                 Center.Y:= SourceBitmap.Height div 2;
                end;
  end;

  DestBitmap.PixelFormat := pf24bit;
  Radians := -(Angle[Angle10]) * 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;
И процедура вызова
На форме создал три кнопки для поворотов влево, на 180 и вправо, дав им теги -1, 0 и 1
Код:
procedure TForm2.Button5Click(Sender: TObject);
var
  jpg: TJPEGImage;
  bmp, bmp1: TBitMap;


begin
  jpg := TJPEGImage.Create;
  jpg.LoadFromFile('Имя файла');
  bmp := TBitmap.Create;
  bmp1 := TBitmap.Create;
  bmp.Assign(jpg);

  RotateBitmap_ads(bmp,bmp1, TComponent(Sender).Tag);

  jpg.Assign(bmp1);
  bmp.Free;
  bmp1.Free;

  jpg.SaveToFile('Имя файла');
  jpg.Free;
end;
Если кто знает, как улучшить код - пишите
Kronos913 вне форума Ответить с цитированием
Старый 19.03.2021, 10:22   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Нет смысла использовать тригонометрические функции, ведь поворот на 90 градусов это простая замена строк на столбцы.
Arigato на форуме Ответить с цитированием
Старый 19.03.2021, 15:10   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Нет смысла использовать тригонометрические функции, ведь поворот на 90 градусов это простая замена строк на столбцы.
А как это сделать?
Kronos913 вне форума Ответить с цитированием
Старый 19.03.2021, 17:33   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
А как это сделать?
Цитата:
Код:
  Radians := -(Angle[Angle10]) * PI / 180;
  sinRadians := Sin(Radians);
  cosRadians := Cos(Radians);
посчитать вот это один раз для 90 -90 180 и ...
будет там 0 +1 -1
в соответствии с этими расчетами можно будет доработать последующий код.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.03.2021, 18:55   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 16,218
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
А как это сделать?
Набросал пример:
Код:
procedure RotateBitmap(SourceBitmap: TBitmap; var DestBitmap: TBitmap);
var x, y: Integer;
begin
  DestBitmap.Width := SourceBitmap.Height;
  DestBitmap.Height := SourceBitmap.Width;
  for x := 0 to SourceBitmap.Width - 1 do begin
    for y := 0 to SourceBitmap.Height - 1 do begin
      DestBitmap.Canvas.Pixels[y,x] := SourceBitmap.Canvas.Pixels[x,y];
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var bmp1, bmp2: TBitMap;
begin
  bmp1 := TBitMap.Create;
  bmp1.LoadFromFile('1.bmp');
  bmp2 := TBitMap.Create;
  RotateBitmap(bmp1, bmp2);
  bmp1.Free;
  bmp2.SaveToFile('2.bmp');
  bmp2.Free;
  ShowMessage('ok');
end;
Это просто идея, через Pixels будет работать медленно, но принцип понятен.
Arigato на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить код "Изменить атрибуты файла: создан, изменен, открыт" xpadd91 Visual C++ 0 15.10.2014 20:58
Как повернуть изображение на 180 градусов? kl45gp Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.05.2013 13:10
Повернуть изображение tae1980 Microsoft Office Excel 3 20.01.2012 09:39
Повернуть изображение и сохранить результат new player Мультимедиа в Delphi 2 03.11.2011 12:57
Как повернуть изображение в TextBox(e)? Diego__ Microsoft Office Word 10 18.08.2009 12:01