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.
delphi 图片jpg多张拼接到一张jpg
最新推荐文章于 2023-12-02 12:39:41 发布