您的位置:首页 > 编程语言 > Delphi

delphi 三层 dataclient 存储图片

2020-03-01 13:55 344 查看

    最近开发用到了D7 三层,涉及到图片问题。存储图片的时候无法使用clientDataset, LoadFromStream来保存图片。在网上找了些发现很多人有类似问题。用params来存储文字也发现有截断问题,最好的方式就是‘’‘+str+‘’‘的方式来存储。思路就是把图片转换成字符串来存储。

  //数据库中建表: 

  create table ImgCreate (No int primary key identity(1,1),img varchar(max))


  //加载图片:

  if  OpenPictureDialog1.Execute then
  begin
    if OpenPictureDialog1.FileName<>'' then
    begin
      Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
      imgName := JpegToTex(OpenPictureDialog1.FileName);//图片转换成字符串函数
    end;
  end;

//JpegToTex 函数实现

function JpegToTex(FileName: string): WideString;
var
  FileStream : TFileStream;
  StringStream : TStringStream;
  FSize : integer;
  FileData : string;
  i : integer;
  DataStr : WideString;
begin
  try
    FileStream := TFileStream.Create (FileName, fmOpenRead);
    StringStream := TStringStream.Create('');
    FSize := FileStream.Size;
    StringStream.CopyFrom(FileStream, FSize);
    FileData := StringStream.DataString;
    DataStr := '';
    for i := 1 to Length(FileData) do
    begin
      DataStr := DataStr + InttoHex(Ord(FileData[i]), 2);
    end;
    Result := DataStr;
  finally
    FreeAndNil(FileStream);
    FreeAndNil (StringStream);
  end;
end;

//保存到数据库:

with clientdataset1 do

begin

  close;

  commandText ;= 'Insert Into ImgCreate(img) Values(imgName)' ;

  execute;

end

//从数据库读取

// var imgStr:widestring;

//ds:tdatasource;

      imgStr := ds.DataSet.FieldByName(img).Value;
      if imgStr<>'' then
      begin
        Image1.Picture.Graphic := TextToJpeg(imgStr);
      end else
      begin
        Image1.Picture.Graphic := nil;
      end;

//TextToJpeg函数实现()

function TextToJpeg(str: WideString): TJPEGImage;
var
  buf : array of Byte;
  DataLength : Integer;
  i : Integer;
  DataStr : WideString;
  ByteFile : file of byte;
  jpg : TJPEGImage;
  tmpFileName: string;
begin
  DataStr := str;
  DataLength := Length(DataStr) div 2-1;
  SetLength(buf, DataLength);
  for i := 1 to DataLength do
  begin
    buf[i - 1] := StrToInt('$' + copy(DataStr, (i - 1) * 2 + 1, 2));
  end;
  tmpFileName := ExtractFilePath(ParamStr(0))+'tmp.jpg';
  AssignFile(ByteFile, tmpFileName);
  Rewrite(ByteFile);
  for i := 0 to DataLength - 1 do
  begin
    write(ByteFile, buf[i]);
  end;
  CloseFile(ByteFile);
  Result := TJPEGImage.Create;
  Result.LoadFromFile(tmpFileName);
  DeleteFile(tmpFileName);
end;




  

  • 点赞
  • 收藏
  • 分享
  • 文章举报
liuyangwpyz 发布了4 篇原创文章 · 获赞 0 · 访问量 367 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐