<div dir="ltr"><div>Hi guys!<br><br></div><div>I did a very simple program to see what happens with colors between TColor and TFPColor.<br></div><div><br>The program has just one main form that shows four panels and a TImage object, generates a png image file containing four rectangles with the 'same' color as the panels and load that file to the TImage object with LoadFromFile method.<br>
</div><div>When I tried to load the file (png) generated, the image appears black.<br>However, the image file is generated correctly because I can open it with other viewers like Explorer, Paint and IrfanViewer. <br>Even at design time I can load other png image files normally but not this one generated by this program. <br>
<br>Am I doing something wrong? Maybe a bug?<br><br></div><div>And, why r. g. b colors are inverted on TColor objects?<br><br></div><div>If someone has some free time to see the code and give me a hint I would apreciate a lot!<br>
</div><div><br></div><div>I am using Lazarus 1.0.10 and FPC 2.6.2, Win 7 32 bits<br><br></div>The program is small so the source folows, contents of .pas, .lfm and .lpr:<br><br>unit rgbmain;<br><br>{$mode objfpc}{$H+}<br>
<br>interface<br><br>uses<br>  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,<br>  FPimage,<br>  FPImgCanv,<br>  FPWritePNG;<br><br>type<br><br>  { TForm1 }<br><br>  TForm1 = class(TForm)<br>    Image1: TImage;<br>
    Panel1: TPanel;<br>    Panel2: TPanel;<br>    Panel3: TPanel;<br>    Panel4: TPanel;<br>    procedure FormCreate(Sender: TObject);<br>    procedure GenerateImage(aWidth, aHeight: integer);<br>  private<br>    { private declarations }<br>
  public<br>    { public declarations }<br>  end;<br><br>var<br>  Form1: TForm1;<br><br>const<br>  FileGenerated = 'rgb.png';<br><br>  // TColors used on screen panels<br>  clLtYellow: TColor = ($FFFF40);<br>  clLtYellowR: TColor = ($FF0000);<br>
  clLtYellowG: TColor = ($00FF00);<br>  clLtYellowB: TColor = ($000040);<br><br>  // TFPColors used on FileGenerated<br>  colLtYellow: TFPColor = (Red: $FFFF; Green: $FFFF; Blue: $4000;<br>    Alpha: alphaOpaque);<br>  colLtYellowR: TFPColor = (Red: $FFFF; Green: $0000; Blue: $0000;<br>
    Alpha: alphaOpaque);<br>  colLtYellowG: TFPColor = (Red: $0000; Green: $FFFF; Blue: $0000;<br>    Alpha: alphaOpaque);<br>  colLtYellowB: TFPColor = (Red: $0000; Green: $0000; Blue: $4000;<br>    Alpha: alphaOpaque);<br>
<br>implementation<br><br>{$R *.lfm}<br><br>{ TForm1 }<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>  Panel1.Color := clLtYellowR;<br>  Panel1.Caption := 'R: $FF; G: $00; B: $00';<br>  Panel2.Color := clLtYellowG;<br>
  Panel2.Caption := 'R: $00; G: $FF; B: $00';<br>  Panel3.Color := clLtYellowB;<br>  Panel3.Caption := 'R: $00; G: $00; B: $40';<br>  Panel4.Color:= clLtYellow;<br>  Panel4.Caption := 'R: $FF; G: $FF; B: $40';<br>
  GenerateImage(image1.Width, image1.Height);<br>  image1.Picture.LoadFromFile(FileGenerated);<br>end;<br><br>procedure TForm1.GenerateImage(aWidth, aHeight: integer);<br>var<br>  Img: TFPMemoryImage;<br>  Writer: TFPWriterPNG;<br>
  ms: TMemoryStream;<br>  ImgCanvas: TFPImageCanvas;<br>  fs: TFileStream;<br>begin<br>  Img := nil;<br>  ImgCanvas := nil;<br>  Writer := nil;<br>  ms := nil;<br>  fs := nil;<br>  try<br>    Img := TFPMemoryImage.Create(aWidth, aHeight);<br>
    //Img.UsePalette := False;<br>    ImgCanvas := TFPImageCanvas.Create(Img);<br>    // Red<br>    ImgCanvas.Pen.FPColor := colLtYellowR;<br>    ImgCanvas.Brush.FPColor := colLtYellowR;<br>    ImgCanvas.Rectangle(0, 0, aWidth div 3, aHeight div 2);<br>
    // Green<br>    ImgCanvas.Pen.FPColor := colLtYellowG;<br>    ImgCanvas.Brush.FPColor := colLtYellowG;<br>    ImgCanvas.Rectangle(aWidth div 3, 0, (aWidth div 3)*2, aHeight div 2);<br>    // Blue<br>    ImgCanvas.Pen.FPColor := colLtYellowB;<br>
    ImgCanvas.Brush.FPColor := colLtYellowB;<br>    ImgCanvas.Rectangle((aWidth div 3)*2, 0, aWidth, aHeight div 2);<br>    // RGB<br>    ImgCanvas.Pen.FPColor := colLtYellow;<br>    ImgCanvas.Brush.FPColor := colLtYellow;<br>
    ImgCanvas.Rectangle(0, aHeight div 2, aWidth, aHeight);<br><br>    // write image as png to memory stream<br>    Writer := TFPWriterPNG.Create;<br>    ms := TMemoryStream.Create;<br>    writer.ImageWrite(ms, Img);<br>
<br>    // write memory stream to file<br>    ms.Position := 0;<br>    fs := TFileStream.Create(FileGenerated, fmCreate);<br>    fs.CopyFrom(ms, ms.Size);<br>  finally<br>    ms.Free;<br>    Writer.Free;<br>    ImgCanvas.Free;<br>
    Img.Free;<br>    fs.Free;<br>  end;<br>end;<br><br>end.<br><br>object Form1: TForm1<br>  Left = 325<br>  Height = 277<br>  Top = 145<br>  Width = 492<br>  Caption = 'RGB'<br>  ClientHeight = 277<br>  ClientWidth = 492<br>
  OnCreate = FormCreate<br>  LCLVersion = '1.0.10.0'<br>  object Panel1: TPanel<br>    Left = 8<br>    Height = 50<br>    Top = 8<br>    Width = 150<br>    Caption = 'R'<br>    TabOrder = 0<br>  end<br>  object Panel2: TPanel<br>
    Left = 168<br>    Height = 50<br>    Top = 8<br>    Width = 150<br>    Caption = 'G'<br>    TabOrder = 1<br>  end<br>  object Panel3: TPanel<br>    Left = 336<br>    Height = 50<br>    Top = 8<br>    Width = 150<br>
    Caption = 'B'<br>    Font.Color = clWhite<br>    ParentFont = False<br>    TabOrder = 2<br>  end<br>  object Panel4: TPanel<br>    Left = 8<br>    Height = 50<br>    Top = 64<br>    Width = 478<br>    Caption = 'RGB'<br>
    TabOrder = 3<br>  end<br>  object Image1: TImage<br>    Left = 8<br>    Height = 138<br>    Top = 128<br>    Width = 480<br>    Stretch = True<br>  end<br>end<br><br>program rgb;<br><br>{$mode objfpc}{$H+}<br><br>uses<br>
  {$IFDEF UNIX}{$IFDEF UseCThreads}<br>  cthreads,<br>  {$ENDIF}{$ENDIF}<br>  Interfaces, // this includes the LCL widgetset<br>  Forms, rgbmain<br>  { you can add units after this };<br><br>{$R *.res}<br><br>begin<br>  RequireDerivedFormResource := True;<br>
  Application.Initialize;<br>  Application.CreateForm(TForm1, Form1);<br>  Application.Run;<br>end.<br><br></div>