* 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+}
uses
Classes, SysUtils, CustApp, fpimage, fpqrcodegen, fpimgqrcode,
Classes, SysUtils, CustApp, fpimage, fpqrcodegen, fpimgqrcode,
fpwritepng,fpwritebmp,fpwritexpm, FPWriteJPEG, FPWritePCX,
FPWritePNM, FPWriteTIFF;
@ -15,11 +15,8 @@ type
TCreateQRApplication = class(TCustomApplication)
Private
FText : UTF8String;
FBorder : Integer;
Foutput : String;
FPixelSize : Integer;
FGenerator : TImageQRCodeGenerator;
procedure WriteQRCode(QRCode: TQRBuffer);
protected
function ParseOptions : Boolean;
@ -47,7 +44,7 @@ begin
end;
FText:=GetOptionValue('t','text');
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');
if Foutput='' then
Foutput:='qrcode.png';
@ -82,45 +79,10 @@ begin
if not ParseOptions then
exit;
FGenerator.Generate(FText);
FGenerator.SaveToFile(Foutput,FBorder);
FGenerator.SaveToFile(Foutput);
Terminate;
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);
begin
inherited Create(TheOwner);

View File

@ -27,15 +27,16 @@ type
TImageQRCodeGenerator = Class(TQRCodeGenerator)
private
FOrigin: TPoint;
FPixelSize: Integer;
FBorder: Integer;
Public
Constructor Create; override;
Procedure Draw(Img : TFPCustomImage);
// overrides Origin.
Procedure SaveToFile(const AFileName : String; aBorder : Integer = 0);
Procedure Draw(Img : TFPCustomImage; DestX, DestY: Integer);
Function SaveToStream(const AStream : TStream; AWriter: TFPCustomImageWriter): Boolean;
Function SaveToFile(const AFileName : String): Boolean;
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;
Procedure DrawQRCode(Img : TFPCustomImage; QRCode : TQRBuffer; aOrigin: TPoint; PixelSize : Byte = 1);
@ -89,38 +90,80 @@ end;
procedure TImageQRCodeGenerator.Draw(Img: TFPCustomImage);
begin
DrawQRCode(Img,Bytes,FOrigin,PixelSize);
Draw(Img, 0, 0);
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
Img : TFPCustomImage;
D,S,X,Y : Word;
D,S : Word;
begin
S:=Size;
if S=0 then exit;
Result := S>0;
if not Result then exit;
D:=PixelSize*S;
Img:=TFPCompactImgGray8Bit.Create(D+aBorder*2,D+aBorder*2);
Img:=TFPCompactImgGray8Bit.Create(D+Border*2,D+Border*2);
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);
Img.SaveToFile(aFileName);
Img.SaveToStream(AStream, AWriter);
finally
Img.Free;
end;

View File

@ -189,8 +189,7 @@ begin
if DD>0 then
PY:=DD div 2;
end;
D.Origin:=Point(PX,PY);
D.Draw(aImage);
D.Draw(aImage, PX, PY);
finally
D.Free;
end;