ja - faktisk har jeg en anden metode, hvor jeg først gemmer billedet på harddisken og derefter loader det - det går meget hurtigere, men det kan da umuligt være den mest effektive metode...
De "rå" data for et image må da ligge et eller andet sted hvor man har adgang til dem - jeg kan bare ikke lige finde stedet...
Nu er jeg ikke helt sikker på hvad du mener med et RGB array. Jeg forestiller mig et kvadrat der er grøn i det ene hjørne, rød i det næste, gul i det tredie og blå i det fjerde. og at farverne fader over i hinanden hen over kvadratet.
nej - det er bare r,g,b værdierne (0-255) for hver pixel i et tilfældigt billede (fra et kamera tilsluttet computeren) - jeg har fx et billede der er 1024x768 - det ligger i et 1 dim array med længden 1024x768x3 (som output fra en dll-fil). Det er det array, jeg gerne vil vise i et image på den hurtigste måde...
Ja de rå data ligger der men så skal du selv sørge for at opløse rgb til det fmt som de screen-buffer bruger (dib) mv. Du skal create et image og sætte canvas størrelsen og så loope dine egne data igennem og plotte punkt for punkt
for x=0 to xsz do for y=0 to ysz do canvas.pixels[x,y]:=billedeData[x,y];
image1.Canvas.Pixels[x,y]:=rgb(af de relavante data);
jeg har også prøvet med:
image1.Canvas.Brush.Color:=rgb(af de relavante data); image1.Canvas.FrameRect(Rect(x,y,x,y));
begge metoder virker, men er langsomme... det kan jo ikke passe, at det er hurtigere at gemme billedet ned på harddisken end det er at flytte det i hukommelsen eller pointe til det...
prøv med denne class, husk at sætte antal farver, width, height inden du kalder GetInfo, herefter kan du hente en pointer til imagedata med ExtBmp.Info.bmBits, hope i works :)
unit ExtBmpUnit;
// Made by Thomas la Cour delphi@hyrtwol.dk
interface
uses Windows, Graphics, SysUtils;
type TExtBmpInfo = Windows.TBitmap; { bmType; bmWidth; bmHeight; bmWidthBytes; bmPlanes; bmBitsPixel; bmBits; pointer to image buffer }
TExtBmp = class(TBitmap) private public Info: TExtBmpInfo; constructor Create; override; destructor Destroy; override; procedure GetInfo; published end;
implementation
constructor TExtBmp.Create; begin inherited; FillChar(Info,sizeof(Info),#0); end;
destructor TExtBmp.Destroy; begin inherited; end;
procedure TExtBmp.GetInfo; begin if not Empty then GetObject(Handle,sizeof(Info),@Info) else FillChar(Info,sizeof(Info),#0); end;
var ExtBmp: TExtBmp; ImageData: array[1..Image_width*Image_height*3] of byte; i: LongWord;
begin //her er ImageData fyldt med crap - der skal selvfølgelig være "rigtige" data for i:=1 to Image_width*Image_height*3 do ImageData[i]:=random(256);
ExtBmp:=TExtBmp.Create; with ExtBmp do begin width:=Image_width; height:=Image_height; //antal farver???
const Image_width=640; Image_height=480; var ExtBmp: TExtBmp; i: Integer; p: PByteArray; begin ExtBmp:=TExtBmp.Create; with ExtBmp do begin Width:=Image_width; Height:=Image_height; PixelFormat:=pf24bit; GetInfo; p:=ExtBmp.Info.bmBits; for i:=0 to Image_width*Image_height*3-1 do p[i]:=random(256); end; Image1.Picture.Assign(ExtBmp); ExtBmp.Free; end;
eller den her hvis du skal pille ved rgb værdierne..
const Image_width=640; Image_height=480; type rgb_array = array[0..0] of TRGBTriple; var ExtBmp: TExtBmp; i: Integer; p: ^rgb_array; begin ExtBmp:=TExtBmp.Create; with ExtBmp do begin Width:=Image_width; Height:=Image_height; PixelFormat:=pf24bit; GetInfo; p:=ExtBmp.Info.bmBits; for i:=0 to Image_width*Image_height-1 do with p[i] do begin rgbtRed:=random(256); rgbtGreen:=random(256); rgbtBlue:=random(256); end; end; Image1.Picture.Assign(ExtBmp); ExtBmp.Destroy; end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.