mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 17:49:29 +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
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user