Lazarus

Programming => Graphics and Multimedia => Graphics => Topic started by: rforcen on January 28, 2022, 10:06:10 am

Title: array of uint32 to TImage [SOLVED]
Post by: rforcen on January 28, 2022, 10:06:10 am
how can i directly convert an array of uint32 to a TImage without cycling with a SetPixel(x,y,color) ?
i've coded a sample loop solution using fpimage:

EDIT: i've used this to write a jpeg file of a mandelbrot fractal, complete code @ https://github.com/rforcen/fpc/tree/main/mandel

Code: Pascal  [Select][+][-]
  1. {$mode objfpc}{$h+}
  2. program Prog_au32totimage;
  3.  
  4. uses classes, sysutils,
  5.      FPImage, FPWriteJPEG;
  6.  
  7. var
  8.   au32 : array of uint32;
  9.   w,h: integer;
  10.  
  11.   i: integer;
  12.  
  13. //
  14. function au32ToImage(au32:array of uint32; w,h:integer) : TFPMemoryImage;
  15. var
  16.   i,j : integer;
  17.   pix : uint32;
  18.   col : TFPColor; // rgba in 0..$ffff range -> (0..$ff) << 8
  19. begin
  20.   au32ToImage := TFPMemoryImage.Create(w,h);
  21.  
  22.   for i:=0 to w-1 do
  23.     for j:=0 to h-1 do begin
  24.       pix:=au32[i*w + j];
  25.       with col do begin
  26.         red:=(pix and $FF) shl 8;
  27.         green:=((pix shr 8) and $FF) shl 8;
  28.         blue:=((pix shr 16) and $FF) shl 8;
  29.         alpha:=((pix shr 24) and $FF) shl 8;
  30.       end;
  31.       au32ToImage.Colors[i, j] := col;
  32.     end;
  33. end;
  34.  
  35. //
  36. procedure au32ToJPEG(au32:array of uint32; w,h:integer; fileName:string);
  37. var  
  38.   writer: TFPCustomImageWriter;
  39.   image : TFPMemoryImage;
  40.  
  41. begin
  42.   image:=au32ToImage(au32, w,h);
  43.  
  44.   writer:=TFPWriterJPEG.Create;
  45.   image.SaveToFile(fileName, writer);
  46.  
  47.   image.free;
  48.   writer.free;
  49. end;
  50.  
  51. /////
  52. begin
  53.   w:=1024; h:=w;
  54.   SetLength(au32, w*h);
  55.  
  56.   randomize;
  57.   for i:=0 to w*h-1 do
  58.     au32[i]:=random($ff000000);
  59.  
  60.   au32ToJPEG(au32, w,h, 'au32.jpg');
  61. end.
  62.  
Title: Re: array of uint32 to TImage
Post by: Zvoni on January 28, 2022, 11:14:18 am
i take it, your array of UInt32 contains the Color-Values?
The only thing coming to mind:
you would have to find the property of TImage which actually contains the color-information per x/y-coordinate (a TCanvas, TBitmap, whatever?).
That's assuming that Property is a 2D-Array representing height and width with the value being the color

IIRC, the memory-layout of a 2D-Array is "column"-wise, meaning:
e.g. Let's say you have 8 x 4 2D-Array (8 rows and 4 columns), so your array of UInt32 would have 32 Members [0..31]
"cell" [0,1] (First Row, second column) would have a memory-address of cell[7,0] (8th Row, 1st column) + 4 bytes

Addr.   Cell
1000   0,0
1004   1,0
1008   2,0
1012   3,0
1016   4,0
1020   5,0
1024   6,0
1028   7,0
1032   0,1
1036   1,1
1040   2,1
1044   3,1

In that case: Bring your array of UInt32 in the "correct" order and then copy it over to [0,0]

Note: I have no idea how SetPixel works (as in: Is it just assigning the Value to x,y or is there some additional black magic happening)
Though, might be completely wrong here
Title: Re: array of uint32 to TImage
Post by: rforcen on January 28, 2022, 11:34:25 am
yes the array contains 8 bit ARGB values coded in uint32,

i was looking for something more direct in the line of facilities provided by image magick or pillow in python, anyhow the coded added to my initial post can do the trick by now,
thankx
Title: Re: array of uint32 to TImage
Post by: wp on January 28, 2022, 12:07:57 pm
In the attachment there is a solution based on TRawImage and TBitmap.LoadFromRawImage; it does not require a temporary image file.
Title: Re: array of uint32 to TImage
Post by: rforcen on January 28, 2022, 12:14:39 pm
Wow!, thankx that's exactly what i was looking for!  :D

using it, coded a mandelbrot fractal browser with MT generation

https://github.com/rforcen/fpc/tree/main/mandelbrot

edit: changed generation engine to c++ and gained a x2 boost, same with:

https://github.com/rforcen/fpc/tree/main/voronoi
TinyPortal © 2005-2018