瀏覽代碼

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

git-svn-id: trunk@37492 -
michael 7 年之前
父節點
當前提交
b5f9cce9e4

+ 3 - 41
packages/fcl-image/examples/createqrcode.pp

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

+ 66 - 23
packages/fcl-image/src/fpimgqrcode.pp

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

+ 1 - 2
packages/fcl-report/src/fpreportqrcode.pp

@@ -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);
+    D.Draw(aImage, PX, PY);
   finally
   finally
     D.Free;
     D.Free;
   end;
   end;