AsphyrePNG.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:5k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyrePNG;
  2. //---------------------------------------------------------------------------
  3. // AsphyrePNG.pas                                       Modified: 04-Jan-2007
  4. // Portable Network Graphics format support for Asphyre           Version 1.0
  5. //---------------------------------------------------------------------------
  6. // IMPORTANT: This file is subject to TPNGImage license agreement and is not
  7. // covered by MPL! Please refer to 'pngimage.pas' file for information.
  8. //
  9. // Thanks to Gustavo Huffenbacher Daud (gustavo.daud@terra.com.br) for the
  10. // permission to use his excellent component.
  11. //
  12. // You can retreive the original package at:
  13. //    http://pngdelphi.sourceforge.net
  14. //---------------------------------------------------------------------------
  15. interface
  16. //---------------------------------------------------------------------------
  17. uses
  18.  Classes, SysUtils, Graphics, PNGImage;
  19. //---------------------------------------------------------------------------
  20. // LoadPNGtoBMP()
  21. //
  22. // Loads Portable Network Graphics format stream to bitmap.
  23. //---------------------------------------------------------------------------
  24. function LoadPNGtoBMP(Stream: TStream; Dest: TBitmap): Boolean; overload;
  25. //---------------------------------------------------------------------------
  26. // SaveBMPtoPNG()
  27. //
  28. // Saves bitmap as Portable Network Graphics format in steam.
  29. // NOTICE: 'Ratio' is between 0 and 9.
  30. //---------------------------------------------------------------------------
  31. function SaveBMPtoPNG(Stream: TStream; Source: TBitmap;
  32.  Ratio: Integer): Boolean; overload;
  33. //---------------------------------------------------------------------------
  34. // Overloaded functions to save/load JPGs to/from external files.
  35. //---------------------------------------------------------------------------
  36. function LoadPNGtoBMP(const FileName: string; Dest: TBitmap): Boolean; overload;
  37. function SaveBMPtoPNG(const FileName: string; Source: TBitmap;
  38.  Ratio: Integer): Boolean; overload;
  39. //---------------------------------------------------------------------------
  40. implementation
  41. //---------------------------------------------------------------------------
  42. function LoadPNGtoBMP(Stream: TStream; Dest: TBitmap): Boolean; overload;
  43. var
  44.  Image: TPngObject;
  45.  ScanIndex, i: Integer;
  46.  PxScan : PLongword;
  47.  PxAlpha: PByte;
  48. begin
  49.  Result:= True;
  50.  Image:= TPngObject.Create();
  51.  try
  52.   Image.LoadFromStream(Stream);
  53.  except
  54.   Result:= False;
  55.  end;
  56.  if (Result) then
  57.   begin
  58.    Image.AssignTo(Dest);
  59.    if (Image.Header.ColorType = COLOR_RGBALPHA)or(Image.Header.ColorType = COLOR_GRAYSCALEALPHA) then
  60.     begin
  61.      Dest.PixelFormat:= pf32bit;
  62.      for ScanIndex:= 0 to Dest.Height - 1 do
  63.       begin
  64.        PxScan := Dest.Scanline[ScanIndex];
  65.        PxAlpha:= @Image.AlphaScanline[ScanIndex][0];
  66.        for i:= 0 to Dest.Width - 1 do
  67.         begin
  68.          PxScan^:= (PxScan^ and $FFFFFF) or (Longword(Byte(PxAlpha^)) shl 24);
  69.          Inc(PxScan);
  70.          Inc(PxAlpha);
  71.         end;
  72.       end;
  73.     end;
  74.   end;
  75.  Image.Free();
  76. end;
  77. //---------------------------------------------------------------------------
  78. function SaveBMPtoPNG(Stream: TStream; Source: TBitmap;
  79.  Ratio: Integer): Boolean; overload;
  80. var
  81.  Image: TPNGObject;
  82.  ScanIndex, i: Integer;
  83.  PxScan : PLongword;
  84.  PxAlpha: PByte;
  85. begin
  86.  Result:= True;
  87.  Image:= TPNGObject.Create();
  88.  Image.Assign(Source);
  89.  if (Source.PixelFormat = pf32bit) then
  90.   begin
  91.    Image.CreateAlpha();
  92.    for ScanIndex:= 0 to Source.Height - 1 do
  93.     begin
  94.      PxScan := Source.Scanline[ScanIndex];
  95.      PxAlpha:= @Image.AlphaScanline[ScanIndex][0];
  96.      for i:= 0 to Source.Width - 1 do
  97.       begin
  98.        PxAlpha^:= Longword(PxScan^) shr 24;
  99.        Inc(PxScan);
  100.        Inc(PxAlpha);
  101.       end;
  102.     end;
  103.   end;
  104.  Image.CompressionLevel:= Ratio;
  105.  try
  106.   Image.SaveToStream(Stream);
  107.  except
  108.   Result:= False;
  109.  end;
  110.    
  111.  Image.Free();
  112. end;
  113. //---------------------------------------------------------------------------
  114. function LoadPNGtoBMP(const FileName: string; Dest: TBitmap): Boolean; overload;
  115. var
  116.  Stream: TStream;
  117. begin
  118.  Stream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  119.  try
  120.   Result:= LoadPNGtoBMP(Stream, Dest);
  121.  finally
  122.   Stream.Free();
  123.  end;
  124. end;
  125. //---------------------------------------------------------------------------
  126. function SaveBMPtoPNG(const FileName: string; Source: TBitmap;
  127.  Ratio: Integer): Boolean; overload;
  128. var
  129.  Stream: TStream;
  130. begin
  131.  Stream:= TFileStream.Create(FileName, fmCreate or fmShareExclusive);
  132.  try
  133.   Result:= SaveBMPtoPNG(Stream, Source, Ratio);
  134.  finally
  135.   Stream.Free();
  136.  end;
  137. end;
  138. //---------------------------------------------------------------------------
  139. end.