图片显示处理 delphi7调用测试

{*------------------------------------------------------------------------
Filename:    UntImage.pas
Author:       张述勇
Version:      1.0
Date:         2004.6.2
Description:  图片操作处理类
  功能:对于建立批量图片;
                建立图片、建立图片标注、图片定位。
Others:     
Revision history:    
 
//------------------------------------------------------------------------- }

unit UntImage;

interface

uses  classes,Windows, SysUtils,Dialogs,Forms,Controls,Graphics,StdCtrls,ExtCtrls,jpeg,types,DBClient;

const
  IMG_WIDTH  = 100; //图片宽度
  IMG_HEIGHT = 100; //图片高度
  IMG_SPACE  = 50; //图片间距
  DESC_HEIGHT = 45;
  IMG_DESC_SPACE = 5;//图片与描述之间的间距


type
  {文件信息类 记录图形文件的各种信息,如名字,路径,类型等}
  TImgInfo = class(Tobject)
    ImgPath : string;   //文件路径 和 文件名
    ImgName : string;   //文件名称 (指文件标识)
    ImgType : string;   //文件类型
    ImgAuto  : Boolean; //是否自动缩放(图片控件)
    ImgStrect: Boolean; //是否自动缩放(图片)
    Remark   : string;  // 备注
  end;

type
  TImageOperat = Class(TObject) {图片操作类}
  private
    Big_Img : TImage;
    Mem_Label:Tmemo;
   ImgInfoList : Tlist; {图片信息容器}


    ImgArr : Array of TImage; {图片信息对像数组}
    DescArr :Array of TMemo; {图片描述对象数组,对应每一张图片一个}
    {把取得图像文件的信息,压人ImgInfoList容器中}
    procedure  ProAddImgInfo(ParamImgInfo : TImgInfo);
    {根据TLIST中的数据建立图形,
       ParamParent参数为图形的父组件}
    function  FunCreateImg(ParamCon:TWinControl):Boolean;
    {根据信息建立图片的标注 例如:文件名一样;
       ParamParent参数为图形的父组件,ParamData 参数为图形的数据}
    procedure  ProCreateLabel(ParamCon:TWinControl;ParamData:TClientDataSet);
    {处理建立的图片的位置
      ParamParent 图形的父组件;ParamPosition 第一行图片的TOP定位}
    procedure  ProSetImgPosition(ParamCon:TWinControl;ParamPosition:Integer);
    {对字符串进行拆分 加入回车符
      ParamStr参数为整个字符;ParamLen 参数为每行的字符个数}
    function  FunWordWarp(ParamStr:String;ParamLen:Integer):String;
    //
    procedure FunImgClick(Sender: Tobject);

  //  procedure  FunImgClick(Sender:Tobject) ;

 

  public

    {构造}
    constructor  Create;
    {析构}
    destructor  Destory;
     {取得图像文件的路径}
    function  FunGetFilePath(FileName:String):String;
     {调用图片显示过程
     ParamParent 图形的父组件; ParamData 参数为图形的数据}
    procedure ProImageShow(ParamCon:TWinControl;ParamData:TClientDataSet);
    procedure SetBig_Img(var ParamImg:Timage;var ParamMem:TMemo);
    Procedure FreeImg;


  end;

var
  Image :TImageOperat ;
  Imgpath:string;

implementation

//uses uImgManager;


{ TImageOperat }

procedure TImageOperat.FunImgClick(Sender: Tobject);
var
  I:integer;
  Name:string;
begin
  try
    Name := (sender as TImage).Name ;
    I := StrToInt(copy(Name,7,length(Name)-1));
    Big_Img.Picture.LoadFromFile(TImgInfo(Image.ImgInfoList[I]).ImgPath);
    Mem_Label.Text := TImgInfo(Image.ImgInfoList[I]).ImgName;
  except
    Application.MessageBox('图片打开出错,检查是否存在该图片','信息提示',MB_OK+MB_IconInformation);
  end;
end;

constructor TImageOperat.Create;
begin

end;

destructor TImageOperat.Destory;
var
  i : Integer;
begin
  for i := 0 to length(ImgArr)-1 do
     FreeAndNil(ImgArr[i]);
  if Assigned(ImgInfoList) then
  begin
     ImgInfoList.Clear;
     ImgInfoList.Free;
     ImgInfoList := nil;
  end;
end;

procedure TImageOperat.ProAddImgInfo(ParamImgInfo : TImgInfo);
begin
  if not Assigned(ImgInfoList) then
    ImgInfoList := TList.Create;
  ImgInfoList.Add(ParamImgInfo);
end;

function TImageOperat.FunGetFilePath(FileName:String): String;
begin
  Result := ExtractFilePath(Paramstr(0))+'Jpg\'+ FileName ;
end;

function TImageOperat.FunCreateImg(ParamCon:TWinControl): Boolean;
var
  I : Integer;
begin
  setLength(ImgArr,ImgInfoList.Count);
  for i := 0 to ImgInfoList.Count-1 do
  begin
    ImgArr[I] := TImage.Create(nil);
    ImgArr[I].parent := ParamCon;
    ImgArr[I].AutoSize := False;
    ImgArr[I].Stretch := True;
    ImgArr[I].Width := IMG_WIDTH;
    ImgArr[I].Height := IMG_HEIGHT;
    ImgArr[I].Name := 'ImgArr'+IntTostr(I);
    ImgArr[I].OnClick := FunImgClick;
    if FileExists(TImgInfo(ImgInfoList[i]).ImgPath) then
      ImgArr[I].Picture.LoadFromFile(TImgInfo(ImgInfoList[i]).ImgPath);
  end;
end;

procedure TImageOperat.ProCreateLabel(ParamCon: TWinControl;
  ParamData:TClientDataSet);
var
  I : Integer;
  tmpLabel:Tmemo;
begin
  SetLength(DescArr,length(ImgArr));
  for I := 0 to length(DescArr)-1 do
  begin
    DescArr[I] := Tmemo.Create(nil);
    DescArr[I].Font.Name := '宋体';
    DescArr[I].Font.Size := 9;
    DescArr[I].WordWrap := True;
    DescArr[I].BorderStyle := bsNone;
    DescArr[I].BevelInner := bvNone;
    DescArr[I].BevelOuter := bvNOne;
    DescArr[I].Parent := ParamCon;
    DescArr[I].Width := IMG_WIDTH;
    DescArr[I].Height := DESC_HEIGHT;
    DescArr[I].Color := cl3DLight;

    DescArr[I].Text := ParamData.FieldValues['Pr_name'];
    DescArr[I].Top := ImgArr[i].Top + ImgArr[i].Height + IMG_DESC_SPACE;
    DescArr[I].Left := ImgArr[i].Left;
    {if DescArr[I].Width > ImgArr[i].Width then
    begin
      DescArr[I].Width := ImgArr[i].Width;
      DescArr[I].Height := ((DescArr[I].Width div ImgArr[i].Width)+1)*DESC_HEIGHT;
      DescArr[I].Left := ImgArr[i].Left;
      DescArr[I].Caption := FunWordWarp(ParamData.FieldValues['Pr_name'],ImgArr[i].Width);
    end
    else
    begin
      DescArr[I].Left := ImgArr[i].Left+Trunc(ImgArr[i].Width-DescArr[I].Width/2);
    end;  }
  end;
end;

procedure TImageOperat.ProSetImgPosition(ParamCon:TWinControl;ParamPosition:Integer);
var
  i,j,k : Integer;    {计数器}
  Row,Col: Integer;   {行 列}
begin
  k:= 0;
  Col := ParamCon.Width div (IMG_WIDTH+IMG_SPACE);
  Row := ImgInfoList.Count div Col;
  if  ImgInfoList.Count mod Col >0 then Row :=Row +1;
  for i := 0 to Row-1 do
    for j:= 0 to Col-1 do
    begin 
      ImgArr[k].Top := ParamPosition+IMG_SPACE+(IMG_HEIGHT+IMG_SPACE)*i;
      ImgArr[k].Left := (IMG_WIDTH+IMG_SPACE)*j;
      k := k+1 ;
      if k= ImgInfoList.Count then break;
    end; 
end;

procedure TImageOperat.ProImageShow(ParamCon:TWinControl;ParamData:TClientDataSet);//调用图片显示过程
var
  I : Integer;
  ImgInfo : TImgInfo;
begin
  try


   // for I := 0 to ParamData.RecordCount-1  do
   if ParamData.RecordCount= 0 then Exit;
   ParamData.First;
    while not ParamData.Eof do
    begin
      ImgInfo := TImgInfo.Create;
      ImgInfo.ImgPath := ParamData.FieldByName('ImageName').AsString;
      ImgInfo.ImgName := ParamData.FieldByName('Pr_name').AsString;
      Image.ProAddImgInfo(ImgInfo);  //压入到图片容器中
      ParamData.Next;
    end ;
     {建立图片对象}
    Image.FunCreateImg(ParamCon);
    {移动图片相对位置}
    Image.ProSetImgPosition(ParamCon,5);
    Image.ProCreateLabel(ParamCon,ParamData);
  finally
  //  FreeAndNil(ImgInfo);
  end;
end; 

 

function TImageOperat.FunWordWarp(ParamStr: String; ParamLen: Integer):String;
var
  StrLen,I : Integer;
  TmpStr:String;
begin
  StrLen := Length(ParamStr);
  TmpStr := '';
  for I := 0 to Length(ParamStr)-1 do
  begin
    if I = 0 then
      TmpStr := Copy(ParamStr,I*ParamLen,ParamLen)
    else
      TmpStr := TmpStr+#13+#10+Copy(ParamStr,I*ParamLen,ParamLen);
  end;
  Result := TmpStr;
end;

 

{procedure TImageOperat.FunImgClick(Sender: Tobject);
var
  I:integer;
  Name:string;
begin
  try
    Name := (sender as TImage).Name ;
    I := StrToInt(copy(Name,7,length(Name)-1));
    Big_Img.Picture.LoadFromFile(TImgInfo(ImgInfoList[I]).ImgPath);
  except 
  end;
end;  }

procedure TImageOperat.SetBig_Img(var ParamImg:Timage;var ParamMem:TMemo);
begin
  Big_Img := ParamImg;
  Mem_Label  := paramMem;
end;

//initialization
//  Image :=TImageOperat.Create;

//finalization
 // FreeAndNil(Image);

procedure TImageOperat.FreeImg;
var
  i : integer;
begin
   {对上次所有图形标识进行释放}
    for i:= Length(ImgArr)-1 downto 0 do
    begin
      freeAndNil(ImgArr[I]);
      FreeAndNil(DescArr[I]);
    end;
    {数据容器清空}
    if Assigned(ImgInfoList) then
    begin
      ImgInfoList.Clear;
      ImgInfoList :=  nil;
    end;

end;

end.

posted on 2004-09-19 16:19  Null  阅读(1360)  评论(0)    收藏  举报