mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 15:09:19 +02:00
* Patch from Ondrej Pokorny to improve QR drawing code interface (bug ID 32580)
git-svn-id: trunk@37492 -
This commit is contained in:
parent
aa83ab3c7d
commit
b5f9cce9e4
@ -15,11 +15,8 @@ type
|
|||||||
TCreateQRApplication = class(TCustomApplication)
|
TCreateQRApplication = class(TCustomApplication)
|
||||||
Private
|
Private
|
||||||
FText : UTF8String;
|
FText : UTF8String;
|
||||||
FBorder : Integer;
|
|
||||||
Foutput : String;
|
Foutput : String;
|
||||||
FPixelSize : Integer;
|
|
||||||
FGenerator : TImageQRCodeGenerator;
|
FGenerator : TImageQRCodeGenerator;
|
||||||
procedure WriteQRCode(QRCode: TQRBuffer);
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
function ParseOptions : Boolean;
|
function ParseOptions : Boolean;
|
||||||
@ -47,7 +44,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
FText:=GetOptionValue('t','text');
|
FText:=GetOptionValue('t','text');
|
||||||
FGenerator.PixelSize:=StrToIntDef(GetOptionValue('p','pixel-size'),4);
|
FGenerator.PixelSize:=StrToIntDef(GetOptionValue('p','pixel-size'),4);
|
||||||
FBorder:=StrToIntDef(GetOptionValue('b','border'),0);
|
FGenerator.Border:=StrToIntDef(GetOptionValue('b','border'),0);
|
||||||
FOutput:=GetOptionValue('o','output');
|
FOutput:=GetOptionValue('o','output');
|
||||||
if Foutput='' then
|
if Foutput='' then
|
||||||
Foutput:='qrcode.png';
|
Foutput:='qrcode.png';
|
||||||
@ -82,45 +79,10 @@ begin
|
|||||||
if not ParseOptions then
|
if not ParseOptions then
|
||||||
exit;
|
exit;
|
||||||
FGenerator.Generate(FText);
|
FGenerator.Generate(FText);
|
||||||
FGenerator.SaveToFile(Foutput,FBorder);
|
FGenerator.SaveToFile(Foutput);
|
||||||
Terminate;
|
Terminate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCreateQRApplication.WriteQRCode(QRCode: TQRBuffer);
|
|
||||||
|
|
||||||
Var
|
|
||||||
Img : TFPCustomImage;
|
|
||||||
D,S,X,Y : Word;
|
|
||||||
|
|
||||||
|
|
||||||
begin
|
|
||||||
S:=QRGetSize(QRCode);
|
|
||||||
if S=0 then exit;
|
|
||||||
D:=FPixelSize*S;
|
|
||||||
|
|
||||||
Img:=TFPCompactImgGray8Bit.Create(D+FBorder*2,D+FBorder*2);
|
|
||||||
try
|
|
||||||
For X:=0 to D+(FBorder*2)-1 do
|
|
||||||
For Y:=1 to FBorder do
|
|
||||||
begin
|
|
||||||
Img[X,Y-1]:=colWhite;
|
|
||||||
Img[X,D+(FBorder*2)-Y]:=colWhite;
|
|
||||||
end;
|
|
||||||
For Y:=FBorder to D+FBorder-1 do
|
|
||||||
For X:=1 to FBorder do
|
|
||||||
begin
|
|
||||||
Img[X-1,Y]:=colWhite;
|
|
||||||
Img[D+(FBorder*2)-X,Y]:=colWhite;
|
|
||||||
end;
|
|
||||||
|
|
||||||
DrawQRCode(Img,QRCode,Point(FBorder,FBorder),FPixelSize);
|
|
||||||
Img.SaveToFile(Foutput);
|
|
||||||
finally
|
|
||||||
Img.Free;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
constructor TCreateQRApplication.Create(TheOwner: TComponent);
|
constructor TCreateQRApplication.Create(TheOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited Create(TheOwner);
|
inherited Create(TheOwner);
|
||||||
|
@ -27,15 +27,16 @@ type
|
|||||||
|
|
||||||
TImageQRCodeGenerator = Class(TQRCodeGenerator)
|
TImageQRCodeGenerator = Class(TQRCodeGenerator)
|
||||||
private
|
private
|
||||||
FOrigin: TPoint;
|
|
||||||
FPixelSize: Integer;
|
FPixelSize: Integer;
|
||||||
|
FBorder: Integer;
|
||||||
Public
|
Public
|
||||||
Constructor Create; override;
|
Constructor Create; override;
|
||||||
Procedure Draw(Img : TFPCustomImage);
|
Procedure Draw(Img : TFPCustomImage);
|
||||||
// overrides Origin.
|
Procedure Draw(Img : TFPCustomImage; DestX, DestY: Integer);
|
||||||
Procedure SaveToFile(const AFileName : String; aBorder : Integer = 0);
|
Function SaveToStream(const AStream : TStream; AWriter: TFPCustomImageWriter): Boolean;
|
||||||
|
Function SaveToFile(const AFileName : String): Boolean;
|
||||||
Property PixelSize : Integer Read FPixelSize Write FPixelSize default 2;
|
Property PixelSize : Integer Read FPixelSize Write FPixelSize default 2;
|
||||||
Property Origin : TPoint Read FOrigin Write FOrigin;
|
Property Border : Integer Read FBorder Write FBorder default 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Procedure DrawQRCode(Img : TFPCustomImage; QRCode : TQRBuffer; aOrigin: TPoint; PixelSize : Byte = 1);
|
Procedure DrawQRCode(Img : TFPCustomImage; QRCode : TQRBuffer; aOrigin: TPoint; PixelSize : Byte = 1);
|
||||||
@ -89,38 +90,80 @@ end;
|
|||||||
|
|
||||||
procedure TImageQRCodeGenerator.Draw(Img: TFPCustomImage);
|
procedure TImageQRCodeGenerator.Draw(Img: TFPCustomImage);
|
||||||
begin
|
begin
|
||||||
DrawQRCode(Img,Bytes,FOrigin,PixelSize);
|
Draw(Img, 0, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TImageQRCodeGenerator.SaveToFile(const AFileName: String; aBorder: Integer);
|
procedure TImageQRCodeGenerator.Draw(Img: TFPCustomImage; DestX,
|
||||||
|
DestY: Integer);
|
||||||
|
var
|
||||||
|
X,Y : Integer;
|
||||||
|
S,D : Integer;
|
||||||
|
begin
|
||||||
|
S:=Size;
|
||||||
|
D:=PixelSize*S;
|
||||||
|
if Border>0 then
|
||||||
|
begin
|
||||||
|
For X:=0 to D+(Border*2)-1 do
|
||||||
|
For Y:=1 to Border do
|
||||||
|
begin
|
||||||
|
Img[DestX+X,DestY+Y-1]:=colWhite;
|
||||||
|
Img[DestX+X,DestY+D+(Border*2)-Y]:=colWhite;
|
||||||
|
end;
|
||||||
|
For Y:=Border to D+Border-1 do
|
||||||
|
For X:=1 to Border do
|
||||||
|
begin
|
||||||
|
Img[DestX+X-1,DestY+Y]:=colWhite;
|
||||||
|
Img[DestX+D+(Border*2)-X,DestY+Y]:=colWhite;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
DrawQRCode(Img,Bytes,Point(DestX+Border,DestY+Border),PixelSize);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TImageQRCodeGenerator.SaveToFile(const AFileName: String): Boolean;
|
||||||
|
|
||||||
|
|
||||||
|
Var
|
||||||
|
WriterClass : TFPCustomImageWriterClass;
|
||||||
|
Writer : TFPCustomImageWriter;
|
||||||
|
Stream : TFileStream;
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := Size>0;
|
||||||
|
if not Result then exit;
|
||||||
|
WriterClass := TFPCustomImage.FindWriterFromFileName(AFileName);
|
||||||
|
if Assigned(WriterClass) then
|
||||||
|
begin
|
||||||
|
Writer := nil;
|
||||||
|
Stream := nil;
|
||||||
|
try
|
||||||
|
Writer := WriterClass.Create;
|
||||||
|
Stream := TFileStream.Create(AFileName, fmCreate);
|
||||||
|
SaveToStream(Stream, Writer);
|
||||||
|
finally
|
||||||
|
Stream.Free;
|
||||||
|
Writer.Free;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
FPImageException.CreateFmt(ErrorText[StrCantDetermineType], [AFileName]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TImageQRCodeGenerator.SaveToStream(const AStream: TStream;
|
||||||
|
AWriter: TFPCustomImageWriter): Boolean;
|
||||||
Var
|
Var
|
||||||
Img : TFPCustomImage;
|
Img : TFPCustomImage;
|
||||||
D,S,X,Y : Word;
|
D,S : Word;
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
S:=Size;
|
S:=Size;
|
||||||
if S=0 then exit;
|
Result := S>0;
|
||||||
|
if not Result then exit;
|
||||||
D:=PixelSize*S;
|
D:=PixelSize*S;
|
||||||
Img:=TFPCompactImgGray8Bit.Create(D+aBorder*2,D+aBorder*2);
|
Img:=TFPCompactImgGray8Bit.Create(D+Border*2,D+Border*2);
|
||||||
try
|
try
|
||||||
For X:=0 to D+(aBorder*2)-1 do
|
|
||||||
For Y:=1 to aBorder do
|
|
||||||
begin
|
|
||||||
Img[X,Y-1]:=colWhite;
|
|
||||||
Img[X,D+(aBorder*2)-Y]:=colWhite;
|
|
||||||
end;
|
|
||||||
For Y:=aBorder to D+aBorder-1 do
|
|
||||||
For X:=1 to aBorder do
|
|
||||||
begin
|
|
||||||
Img[X-1,Y]:=colWhite;
|
|
||||||
Img[D+(aBorder*2)-X,Y]:=colWhite;
|
|
||||||
end;
|
|
||||||
Origin:=Point(aBorder,aBorder);
|
|
||||||
Draw(Img);
|
Draw(Img);
|
||||||
Img.SaveToFile(aFileName);
|
Img.SaveToStream(AStream, AWriter);
|
||||||
finally
|
finally
|
||||||
Img.Free;
|
Img.Free;
|
||||||
end;
|
end;
|
||||||
|
@ -189,8 +189,7 @@ begin
|
|||||||
if DD>0 then
|
if DD>0 then
|
||||||
PY:=DD div 2;
|
PY:=DD div 2;
|
||||||
end;
|
end;
|
||||||
D.Origin:=Point(PX,PY);
|
D.Draw(aImage, PX, PY);
|
||||||
D.Draw(aImage);
|
|
||||||
finally
|
finally
|
||||||
D.Free;
|
D.Free;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user