* Patch from Ondrej Pokorny to improve QR drawing code interface (bug ID 32580)

git-svn-id: trunk@37492 -
This commit is contained in:
michael 2017-10-20 07:17:56 +00:00
parent aa83ab3c7d
commit b5f9cce9e4
3 changed files with 70 additions and 66 deletions

View File

@ -4,7 +4,7 @@ program createqrcode;
{$H+} {$H+}
uses uses
Classes, SysUtils, CustApp, fpimage, fpqrcodegen, fpimgqrcode, Classes, SysUtils, CustApp, fpimage, fpqrcodegen, fpimgqrcode,
fpwritepng,fpwritebmp,fpwritexpm, FPWriteJPEG, FPWritePCX, fpwritepng,fpwritebmp,fpwritexpm, FPWriteJPEG, FPWritePCX,
FPWritePNM, FPWriteTIFF; FPWritePNM, FPWriteTIFF;
@ -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);

View File

@ -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;

View File

@ -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;