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

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

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

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

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

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

Добрый день. Как обрезать изображение по какой-то линии?
Kronos913 вне форума Ответить с цитированием
Старый 10.03.2021, 07:53   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

1. привязаться к кординатам, отсчитываемым от какого-то угла фотографии. либо верхний левый, либо нижний левый.(x, y)
2. ваша линия каким-то уравнением, типа y = k*x+b?
если да, то надо просто пройтись по всем точкам выше этой линии и убрать их (сделать чёрными/белыми)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 10.03.2021, 09:57   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Если речь за фото, то исходный файл будет в формате jpg. Значит подключаем модуль для работы с этим форматом, для этого в раздел uses добавляем JPEG.

Набросал пример кода, из фотки вырезает заданный кусок. Просто доработайте этот пример под свою задачу.
Код:
var
  jpg: TJPEGImage;
  bmp: TBitMap;
  Bound, Rect: TRect;
begin
  jpg := TJPEGImage.Create;
  // загрузка фотографии
  jpg.LoadFromFile('1.jpg');
  // переводим jpg в bmp
  bmp := TBitmap.Create;
  bmp.Assign(jpg);
  // определяем границу области
  with Bound do begin
    Left := 100;
    Top := 200;
    Right := 500;
    Bottom := 400;
  end;
  // вычисляем размер области
  with Rect do begin
    Left := 0;
    Top := 0;
    Right := Bound.Right - Bound.Left;
    Bottom := Bound.Bottom - Bound.Top;
  end;
  // копируем выделенный кусок картинки
  bmp.Canvas.CopyRect(Rect, bmp.Canvas, Bound);
  // изменяем размеры картинки
  bmp.Width := Rect.Right;
  bmp.Height := Rect.Bottom;
  // переводим bmp в jpg
  jpg.Assign(bmp);
  bmp.Free;
  // сохраняем фотку в файл
  jpg.SaveToFile('2.jpg');
  jpg.Free;
end;
Arigato на форуме Ответить с цитированием
Старый 16.03.2021, 14:27   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Может кому понадобится, что я тут нагородил.

Глобальные переменные:
Код:
px1, px2, py1, py2:integer;
Обработка нажатия на изображения, чтобы по нажатию определять границы обрезки
Адекватно работает если само image квадратной формы и включен параметр proportional
Код:
procedure TForm2.Image21MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var
   a, b:real;

begin
 If (Button=mbLeft) or (Button=mbRight) then begin
  if image21.Picture.Height>image21.Picture.Width then begin
   a:=1;
   b:= image21.Picture.Height / image21.Picture.Width;
  end else begin
   a:=image21.Picture.Width / image21.Picture.Height;
   b:=1;
  end;

  if (image21.Picture.Width > image21.Width) or (image21.Picture.Height > image21.Height) then begin
    if Button=mbLeft then begin
       px1 := trunc( b*X*(image21.Picture.Width / image21.Width) );
       py1 := trunc( a*Y*(image21.Picture.Height / image21.Height) );
    end else begin
       px2 := trunc( b*X*(image21.Picture.Width / image21.Width) )-1;
       py2 := trunc( a*Y*(image21.Picture.Height / image21.Height) )-1;
    end;
  end else begin
    if Button=mbLeft then begin
       px1:=X;
       py1:=Y;
    end else begin
       px2:=X;
       py2:=Y;
    end;
  end;

  If px2>image21.Picture.Width then px2:=image21.Picture.Width;
  If py2>image21.Picture.Height then py2:=image21.Picture.Height;

  ImgObr(false);
 end;
end;
Процедура обрезки. Если false - она просто показывает во второе image что выходит, если true - сохраняет результат в файл
Код:
procedure TForm2.ImgObr(q:boolean);
 var
  jpg: TJPEGImage;
  bmp: TBitMap;
  Bound, Rect: TRect;
begin
 If (px2>px1) and (py2>py1) then begin
  jpg := TJPEGImage.Create;
  jpg.LoadFromFile('Файл 1');
  bmp := TBitmap.Create;
  bmp.Assign(jpg);

  with Bound do begin
    Left := px1;
    Top := py1;
    Right := px2;
    Bottom := py2;
  end;

  with Rect do begin
    Left := 0;
    Top := 0;
    Right := Bound.Right - Bound.Left;
    Bottom := Bound.Bottom - Bound.Top;
  end;

  bmp.Canvas.CopyRect(Rect, bmp.Canvas, Bound);
  bmp.Width := Rect.Right;
  bmp.Height := Rect.Bottom;
  jpg.Assign(bmp);
  bmp.Free;

  If q then begin
   jpg.SaveToFile('Файл 2');
  end else begin
   Image22.Picture.Assign(jpg);
  end;
  jpg.Free;
 end;
end;
Сохранение результата:
Код:
procedure TForm2.Button1Click(Sender: TObject);
begin
 ImgObr(true);
 ImageLoad;
end;
Загрузка фото:
Код:
Procedure TForm2.ImageLoad;
begin
  Image21.Picture.LoadFromFile('Имя файла 1');
  Image22.Picture.LoadFromFile('Имя файла 1');
  px1:=0;
  py1:=0;
  px2:=Image21.Picture.Width-1;
  py2:=Image21.Picture.Height-1;
end;
Kronos913 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фото формата png, больше заданного размера и при этом название фото не соответствует названию папки (если включить чекбокс). должно вывести 2(3) ошибки, а выводит только одну Silver_Surfer Общие вопросы Delphi 2 22.01.2020 09:10
Если фото маленькое то лупа увеличивает, но если фото большое тогда уменьшает lybov12 JavaScript, Ajax 0 21.06.2019 11:48
обрезать фото SkrudjMakdak JavaScript, Ajax 4 09.06.2011 16:04
Обрезать фото Cpluser Общие вопросы .NET 5 15.04.2010 12:58