zoukankan      html  css  js  c++  java
  • Demo: 模仿画图程序的选块另存为功能

    Demo: 模仿画图程序的选块另存为功能

    分类: 编程笔记 2007-06-16 10:31

     转自:http://rabbitfox.blog.sohu.com/50812083.html

    (****************************************
     
    单元名称: 模仿画图程序的选块另存为功能
     
        : LihuaSoft
     
    编码日期: 2007616
     
        : 因此程序是演示程序, 只允许使用
                BMP
    格式图片
    *****************************************)

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, jpeg, Menus;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        PopupMenu1: TPopupMenu;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        Bmp : TBitmap;
        rFrom, rTo : TRect;
        CanSelect : boolean;
        MenuItemSaveAs : TMenuItem;
        procedure SelectedSaveAs(Sender: TObject);
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Caption := '
    演示:导入一幅BMP后,拖动鼠标左键选择一块区域,右键另存为';
      Button1.Caption := '
    导入BMP';
      Image1.Left := 0;
      Image1.Top := 0;
      Image1.AutoSize := True;
      OpenDialog1.FileName := '*.BMP';
      OpenDialog1.Filter := 'Windows
    位图文件';
      SaveDialog1.FileName := '*.BMP';
      SaveDialog1.Filter := '
    请输入欲存为的BMP文件名';
      MenuItemSaveAs := TMenuItem.Create(PopupMenu1);
      MenuItemSaveAs.Caption := '
    选区另存为BMP文件';
      MenuItemSaveAs.OnClick := SelectedSaveAs;
      PopupMenu1.Items.Add(MenuItemSaveAs);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if OpenDialog1.Execute then begin
        if Bmp<>nil then FreeAndNil(Bmp);
        Bmp := TBitmap.Create;
        Bmp.LoadFromFile(OpenDialog1.FileName);
        with Image1 do begin
          Picture.Bitmap := Bmp;
          Canvas.Pen.Mode := pmNot;
          Canvas.Brush.Style := bsClear;
          OnMouseDown := Image1MouseDown;
          OnMouseMove := Image1MouseMove;
          OnMouseUp := Image1MouseUp;
        end;
        rFrom := Rect(0, 0, 0, 0);
      end;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if Bmp<>nil then FreeAndNil(Bmp);
      if MenuItemSaveAs<>nil then FreeAndNil(MenuItemSaveAs);
    end;

    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then begin
        CanSelect := True;
        if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then
          Image1.Canvas.Rectangle(rFrom);
        rFrom.Left := X;
        rFrom.Top := Y;
        rFrom.Right := X;
        rFrom.Bottom := Y;
      end;
      if Button = mbRight then
        if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then
          PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
    end;

    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if CanSelect then begin
        Image1.Canvas.Rectangle(rFrom);
        rFrom.Right := X;
        rFrom.Bottom := Y;
        Image1.Canvas.Rectangle(rFrom);
      end;
    end;

    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      CanSelect := False;
    end;

    procedure TForm1.SelectedSaveAs(Sender: TObject);
    var
      TempBmp : TBitmap;
    begin
      if SaveDialog1.Execute then begin
        TempBmp := TBitmap.Create;
        try
          TempBmp.Width := rFrom.Right-rFrom.Left;
          TempBmp.Height := rFrom.Bottom-rFrom.Top;
          rTo := Rect(0, 0, TempBmp.Width, TempBmp.Height);
          TempBmp.Canvas.CopyRect(rTo, Bmp.Canvas, rFrom);
          TempBmp.SaveToFile(SaveDialog1.FileName);
        finally
          TempBmp.Free;
        end;
      end;
    end;

    end.

     

    ======================

     

    200892新增适用JPG格式代码:

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, jpeg, Menus;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        OpenDialog1: TOpenDialog;
        SaveDialog1: TSaveDialog;
        PopupMenu1: TPopupMenu;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        Bmp : TBitmap;
        Jpg : TJpegImage;
        rFrom, rTo : TRect;
        CanSelect : boolean;
        MenuItemSaveAs : TMenuItem;
        procedure SelectedSaveAs(Sender: TObject);
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Caption := '
    演示:导入一幅JPG后,拖动鼠标左键选择一块区域,右键另存为';
      Button1.Caption := '
    导入JPG';
      Image1.Left := 0;
      Image1.Top := 0;
      Image1.AutoSize := True;
      OpenDialog1.FileName := '*.JPG';
      OpenDialog1.Filter := 'Jpeg
    格式文件';
      SaveDialog1.FileName := '*.JPG';
      SaveDialog1.Filter := '
    请输入欲存为的JPG文件名';
      MenuItemSaveAs := TMenuItem.Create(PopupMenu1);
      MenuItemSaveAs.Caption := '
    选区另存为JPG文件';
      MenuItemSaveAs.OnClick := SelectedSaveAs;
      PopupMenu1.Items.Add(MenuItemSaveAs);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if OpenDialog1.Execute then begin
        if not Assigned(Bmp) then Bmp := TBitmap.Create;
        if not Assigned(Jpg) then Jpg := TJpegImage.Create;
        Jpg.LoadFromFile(OpenDialog1.FileName);
        Bmp.Assign(Jpg);
        with Image1 do begin
          Picture.Bitmap := Bmp;
          Canvas.Pen.Mode := pmNot;
          Canvas.Brush.Style := bsClear;
          OnMouseDown := Image1MouseDown;
          OnMouseMove := Image1MouseMove;
          OnMouseUp := Image1MouseUp;
        end;
        rFrom := Rect(0, 0, 0, 0);
      end;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if Bmp<>nil then FreeAndNil(Bmp);
      if Jpg<>nil then FreeAndNil(Jpg);
      if MenuItemSaveAs<>nil then FreeAndNil(MenuItemSaveAs);
    end;

    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then begin
        CanSelect := True;
        if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then
          Image1.Canvas.Rectangle(rFrom);
        rFrom.Left := X;
        rFrom.Top := Y;
        rFrom.Right := X;
        rFrom.Bottom := Y;
      end;
      if Button = mbRight then
        if (rFrom.Left<>rFrom.Right) and (rFrom.Top<>rFrom.Bottom) then
          PopupMenu1.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
    end;

    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if CanSelect then begin
        Image1.Canvas.Rectangle(rFrom);
        rFrom.Right := X;
        rFrom.Bottom := Y;
        Image1.Canvas.Rectangle(rFrom);
      end;
    end;

    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      CanSelect := False;
    end;

    procedure TForm1.SelectedSaveAs(Sender: TObject);
    var
      TempBmp : TBitmap;
      TempJpg : TJpegImage;
    begin
      if SaveDialog1.Execute then begin
        TempBmp := TBitmap.Create;
        TempJpg := TJpegImage.Create;
        try
          TempBmp.Width := rFrom.Right-rFrom.Left;
          TempBmp.Height := rFrom.Bottom-rFrom.Top;
          rTo := Rect(0, 0, TempBmp.Width, TempBmp.Height);
          TempBmp.Canvas.CopyRect(rTo, Bmp.Canvas, rFrom);
          TempJpg.Assign(TempBmp);
          TempJpg.SaveToFile(SaveDialog1.FileName);
        finally
          TempJpg.Free;
          TempBmp.Free;
        end;
      end;
    end;

    end.

     

  • 相关阅读:
    VB.NET中对象的克隆 利用了内存流内象和序列化
    关于对象组件编写的一点想法
    虽然有人说什么和平第一, 经济第一, 可是我怎么能不因为愤怒而发抖?
    用C# 调用MS speech引擎, 让电脑读文本, 或是存到WAV文件里去.
    抽空看了一下 dockpanel suite, 知道如何用了, 立此存照
    dn081A
    如何列出某类型的所有成员
    上周买了毛爷爷传
    【转载】MySQL双主双从高可用集群架构
    【转载】MySQL和Keepalived高可用双主复制
  • 原文地址:https://www.cnblogs.com/hssbsw/p/2551441.html
Copyright © 2011-2022 走看看