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