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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2010, 11:15   #1
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию Canvas обрезать, сохранить..

Есть форма (Form3). Она растянута на весь экран, и фон у неё картинка (того же размера что и форма).

Вообщем функцией DrawFocusRect я узнаю координаты прямоугольника который нужно сохранить.

Код:
StartPlace.x := X;
 StartPlace.y := Y;
 EndPlace.x := X;
 EndPlace.y := Y;
Как по этим координатам обрезать канвас формы, и сохранить в файл?


Код:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Jpeg;

type
  TForm3 = class(TForm)
    Image1: TImage;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    Capturing : bool;
    Captured : bool;
    StartPlace : TPoint;
    EndPlace : TPoint;
  public
    { Public declarations }
  end;

var
  Form3: TForm3;
  Capturing : bool;
  Captured : bool;
  StartPlace : TPoint;
  EndPlace : TPoint;

implementation

{$R *.dfm}

function MakeRect(Pt1 : TPoint; Pt2 : TPoint) : TRect;
begin
  if pt1.x < pt2.x then
  begin
    Result.Left := pt1.x;
    Result.Right := pt2.x;
  end
  else
  begin
    Result.Left := pt2.x;
    Result.Right := pt1.x;
  end;

  if pt1.y < pt2.y then
  begin
    Result.Top := pt1.y;
    Result.Bottom := pt2.y;
  end
  else
  begin
    Result.Top := pt2.y;
    Result.Bottom := pt1.y;
  end;
end;


procedure TForm3.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Captured then
  DrawFocusRect(Form3.Canvas.Handle,MakeRect(StartPlace,EndPlace));
  StartPlace.x := X;
  StartPlace.y := Y;
  EndPlace.x := X;
  EndPlace.y := Y;
  DrawFocusRect(Form3.Canvas.Handle,MakeRect(StartPlace,EndPlace));
  Capturing := true;
  Captured := true;
end;

procedure TForm3.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Capturing then
  begin
    DrawFocusRect(Form3.Canvas.Handle,MakeRect(StartPlace,EndPlace));
    EndPlace.x := X;
    EndPlace.y := Y;
    DrawFocusRect(Form3.Canvas.Handle,MakeRect(StartPlace,EndPlace));
  end;
end;

procedure TForm3.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Capturing := false;
end;

end.
Form1:

Код:
  Form3.Show;
  Form3.Canvas.Draw(0, 0, ABitmap);

Последний раз редактировалось sergeyrulit; 08.08.2010 в 11:18.
sergeyrulit вне форума Ответить с цитированием
Старый 08.08.2010, 11:21   #2
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Создай битмап и далее Canvas.CopyRect или апишный BitBlt
x128 вне форума Ответить с цитированием
Старый 08.08.2010, 11:26   #3
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию

Все утро пытаюсь через CopyRect.. Но не получается. Может кто кодом поможет..
sergeyrulit вне форума Ответить с цитированием
Старый 08.08.2010, 11:42   #4
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

как-то так:
Код:
var
  r: TRect;
...
  r:=Rect(StartPlace.X, StartPlace.Y, EndPlace.X, EndPlace.Y);
  bmp:=TBitmap.Create;
  bmp.PixelFormat:=pf24bit;
  bmp.Height:=r.Bottom-r.Top;
  bmp.Width:=r.Right-r.Left;
  bmp.Canvas.CopyRect(bmp.Canvas.ClipRect, Canvas, r);
  bmp.SaveToFile('MyBitmap.bmp');
  bmp.Destroy;

Последний раз редактировалось x128; 08.08.2010 в 11:52.
x128 вне форума Ответить с цитированием
Старый 08.08.2010, 11:57   #5
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию

Спасибо, но почему то обрезает не совсем так. Допустим, вот что получилось после обрезания: http://s004.radikal.ru/i206/1008/af/1f9ad5957bf0.jpg .. Видишь там белое в верхнем левом угле, а должен быть рисунок...

Я выделял полностью это окно, но оно на половину обрезалось.
sergeyrulit вне форума Ответить с цитированием
Старый 08.08.2010, 12:39   #6
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Спасибо, но почему то обрезает не совсем так.
Я редактировал пост, строка bmp.Canvas.CopyRect(bmp.Canvas.Clip Rect, Canvas, r);, вариант который я написал сначала был с ошибкой.
x128 вне форума Ответить с цитированием
Старый 08.08.2010, 12:54   #7
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию

большое спасибо.
sergeyrulit вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обрезать фото Cpluser Общие вопросы .NET 5 15.04.2010 12:58
как обрезать изоображение в формате jpeg KWN, lnc Мультимедиа в Delphi 5 08.03.2010 13:52
Обрезать текст до заданной длины на Ассемблере stscolt Помощь студентам 0 09.05.2009 05:51
Как сохранить все что изображено на Canvas в файл? PilGrim Мультимедиа в Delphi 2 01.11.2007 21:03
Image1 и Rgn.. как обрезать? Yogik™ Помощь студентам 7 28.09.2007 17:07