delphi 图片jpg多张拼接到一张jpg

unit g_JPEGImageAddTotal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TImageType = (IT_None, IT_Error, IT_Bmp, IT_JPEG, IT_GIF, IT_PCX, IT_PNG, IT_PSD, IT_RAS, IT_SGI, IT_TIFF);

  const
    C_WITH_INTERVAL = 5;
    
  function save2Local_GlobalPersonHeadImg_JpgExt(sPic, sFileName: string; var sErrorMsg: string): Boolean;

  function save2Local_GlobalPersonHeadImg_OneJpg(sPic, sFileName: string; var sErrorMsg: string): Boolean;

  function createNewBarCodeName(sBarCode: string): string;
  
implementation


function FindImageType(Buffer: Word; var sImageType: string): TImageType;
begin
  case Buffer of
    $4D42:
      begin
        sImageType := 'IT_Bmp';
        Result := IT_Bmp;
      end;
    $D8FF:
      begin
        sImageType := 'IT_JPEG';
        Result := IT_JPEG;
      end;
    $4947:
      begin
        sImageType := 'IT_GIF';
        Result := IT_GIF;
      end;
    $050A:
      begin
        sImageType := 'IT_PCX';
        Result := IT_PCX;
      end;
    $5089:
      begin
        sImageType := 'IT_PNG';
        Result := IT_PNG;
      end;
    $4238:
      begin
        sImageType := 'IT_PSD';
        Result := IT_PSD;
      end;
    $A659:
      begin
        sImageType := 'IT_RAS';
        Result := IT_RAS;
      end;
    $DA01:
      begin
        sImageType := 'IT_RAS';
        Result := IT_SGI;
      end;
    $4949:
      begin
        sImageType := 'IT_TIFF';
        Result := IT_TIFF;
      end;
  else
    begin
      sImageType := 'IT_None';
      Result := IT_None;
    end;
  end;
end;

function AddJPEGImage(sFileName: string; mms: array of TMemoryStream; var sErrorMsg: string): Boolean;
var
  i, x, y: Integer;
  jps: array of TJPEGImage;
  bps: array of TBitmap;
  jp2: TJPEGImage;
  bmp: TBitmap;
  lv_Buffer: Word;
  lv_sImageType: string;
  lv_ImageType: TImageType;
begin
  Result := False;
  sErrorMsg := '默认提示消息!';
  try
    jp2 := TJPEGImage.Create;
    bmp := TBitmap.Create;
    try
      for i := 0 to Length(mms)-1 do begin
        mms[i].Position := 0;
        mms[i].ReadBuffer(lv_Buffer, 2);
        lv_ImageType := FindImageType(lv_Buffer, lv_sImageType);
        mms[i].Position := 0;
        if lv_ImageType = IT_Bmp then begin
          SetLength(bps, Length(bps)+1);
          bps[Length(bps)-1] := TBitmap.Create;
          bps[Length(bps)-1].LoadFromStream(mms[i]);
        end else if lv_ImageType = IT_JPEG then begin
          SetLength(jps, Length(jps)+1);
          jps[Length(jps)-1] := TJPEGImage.Create;
          jps[Length(jps)-1].LoadFromStream(mms[i]);

          SetLength(bps, Length(bps)+1);
          bps[Length(bps)-1] := TBitmap.Create;
          bps[Length(bps)-1].Assign(jps[Length(jps)-1]);
        end else begin
          sErrorMsg := ' 图片类型为:' + lv_sImageType + ',不是jpg/bmp格式,忽略此图片,继续轮循下个图片对象!';
          LogAdd('【拼接图片】AddJPEGImage:' + sErrorMsg);
          Continue;
        end;

        bmp.Width := bmp.Width + bps[Length(bps)-1].Width + C_WITH_INTERVAL;
        if i = 0 then begin
          bmp.Height := bps[Length(bps)-1].Height;
          bmp.Canvas.Draw(0, 0, bps[Length(bps)-1]);
        end else begin
          if bmp.Height = 0 then
            bmp.Height := bps[Length(bps)-1].Height;
          bmp.Canvas.Draw(bmp.Width-bps[Length(bps)-1].Width, 0, bps[Length(bps)-1]);
        end;
      end;
      x := Length(jps);
      for x := 0 to x-1 do
        jps[x] := nil;
      y := Length(bps);
      for y := 0 to y-1 do
        bps[y] := nil;

      jp2.Assign(bmp);
      jp2.SaveToFile(sFileName);
      Result := True;
    finally
      FreeAndNil(bmp);
      FreeAndNil(jp2);
    end;
  except
    on e:Exception do begin
      Result := False;
      sErrorMsg := ' 图片拼接,异常失败!';
      LogAdd('【异常】图片保存本地:'+e.Message);
      Exit;
    end;
  end;
end;

function save2Local_GlobalPersonHeadImg_JpgExt(sPic, sFileName: string; var sErrorMsg: string): Boolean;
var
  sUrl: string;
  i, x: Integer;
  IdHTTP1: TIdHTTP;
  aList: TStringList;
  mms: array of TMemoryStream;
begin
  Result := False;
  sErrorMsg := '默认提示消息!';
  try
    if Trim(sPic) = '' then begin
      sErrorMsg := ' 的Url为空!';
      Exit;
    end;
    if (Pos(UpperCase('https://'), UpperCase(sPic)) = 0) and (Pos(UpperCase('http://'), UpperCase(sPic)) = 0) then begin
      sErrorMsg := ' 的Url不规范(请严格按照"https://"、"http://"进行开头的地址)!';
      Exit;
    end;
    LogAdd('【图片】请求原始URL列表:' + sPic);
    aList := TStringList.Create;
    IdHTTP1 := TIdHTTP.Create(nil);
    try
      aList.Delimiter := ',';
      aList.DelimitedText := sPic;
      for i := 0 to aList.Count-1 do begin
        sUrl := aList.Strings[i];
        sUrl := StringReplace(Trim(sUrl),'https://','http://',[]);     // https://nk.xxxxxxxxxxx.com/2022/07/28/1558546214596257745.jpg
        LogAdd('【图片】请求Url:' + sUrl);
        SetLength(mms,i+1);
        mms[i] := TMemoryStream.Create;
        IdHTTP1.Get(sUrl, mms[i]);
        mms[i].Position := 0;
      end;
      if not AddJPEGImage(sFileName, mms, sErrorMsg) then begin
        Exit;
      end;
    finally
      FreeAndNil(IdHTTP1);
      FreeAndNil(aList);
      x := Length(mms);
      for x := 0 to x-1 do
        mms[x].Free;
    end;
    if not FileExists(sFileName) then begin
      sErrorMsg := ' 图片未保存到本地(sFileName=' + sFileName + ')!';
      Exit;
    end;
    LogAdd('【图片】保存本地:' + sFileName);
    Result := True;
  except
    on e:Exception do begin
      Result := False;
      sErrorMsg := '图片保存本地,失败异常!';
      LogAdd('【异常】图片保存本地:'+e.Message);
      Exit;
    end;
  end;
end;

function save2Local_GlobalPersonHeadImg_OneJpg(sPic, sFileName: string; var sErrorMsg: string): Boolean;
var
  sUrl: string;
  ms: TMemoryStream;
  jpg: TJPEGImage;
  IdHTTP1: TIdHTTP;
begin
  Result := False;
  sErrorMsg := '默认提示消息!';
  try
    if Trim(sPic) = '' then begin
      sErrorMsg := ' 的Url为空!';
      Exit;
    end;
    if (Pos(UpperCase('https://'), UpperCase(sPic)) = 0) and (Pos(UpperCase('http://'), UpperCase(sPic)) = 0) then begin
      sErrorMsg := ' 的Url不规范(请严格按照"https://"、"http://"进行开头的地址)!';
      Exit;
    end;
    IdHTTP1 := TIdHTTP.Create(nil);
    jpg := TJPEGImage.Create;
    ms := TMemoryStream.Create;
    try
      sUrl := StringReplace(Trim(sPic),'https://','http://',[]);     // https://nk.xxxxxxxxxxx.com/2022/07/28/1558546214596257745.jpg
      LogAdd('【图片】请求Url:' + sUrl);
      IdHTTP1.Get(sUrl, ms);
      ms.Position := 0;
      jpg.LoadFromStream(ms);
      jpg.SaveToFile(sFileName);
      LogAdd('【图片】保存本地:' + sFileName);
    finally
      FreeAndNil(ms);
      FreeAndNil(jpg);
      FreeAndNil(IdHTTP1);
    end;
    if not FileExists(sFileName) then begin
      sErrorMsg := ' 图片未保存到本地(sFileName=' + sFileName + ')!';
      Exit;
    end;
    Result := True;
  except
    on e:Exception do begin
      sErrorMsg := '图片保存本地,失败异常!';
      LogAdd('【异常】图片保存本地:'+e.Message);
      Exit;
    end;
  end;
end;

function createNewBarCodeName(sBarCode: string): string;
var
  i: Integer;
  lv_sTmp, lv_sResult: string;
  
begin
  Result := '';
  try
    lv_sResult := '';
    lv_sTmp := Trim(sBarCode);
    for i := 0 to Length(lv_sTmp)-1 do begin
      if lv_sTmp[i] in (['0'..'9', 'a'..'z', 'A'..'Z']) then
        lv_sResult := lv_sResult + lv_sTmp[i];
    end;
    if lv_sResult = '' then
      Result := lv_sTmp
    else
      Result := Copy(lv_sResult, Length(lv_sResult)-9, 10);
  except
    on e:Exception do begin
      Result := Trim(sBarCode);
      LogAdd('【异常】条码截取:'+e.Message);
      Exit;
    end;
  end;
end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值