Avatar billede delphin Nybegynder
28. november 2004 - 13:57 Der er 9 kommentarer og
2 løsninger

Array til image

Hvordan får man (hurtigst) et array indeholdende RGB farver vist på skærmen i et image??

Min nuværende metode er for langsom...
28. november 2004 - 23:11 #1
Lad den 'langsomme' metode generere billedet, og gem den f.eks i bmp format. Når du så har billede kan du implementere den på normal vis.
Avatar billede delphin Nybegynder
29. november 2004 - 09:35 #2
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...
29. november 2004 - 20:29 #3
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.
Avatar billede delphin Nybegynder
30. november 2004 - 09:04 #4
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...
Avatar billede nop Nybegynder
30. november 2004 - 09:28 #5
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];

Det vil virke men måske er der hurtiger metoder.
Avatar billede delphin Nybegynder
30. november 2004 - 12:02 #6
Ja - det er faktisk den metode jeg benytter:

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...
Avatar billede hyrtwol Nybegynder
02. december 2004 - 17:12 #7
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;

end.
Avatar billede delphin Nybegynder
04. december 2004 - 21:14 #8
Mange tak for svaret og undskyld den lange svartid - jeg har haft lidt travlt, men jeg er stadig meget interesseret i at få løst problemet...

Jeg forstår ikke helt, hvad du mener, men noget i denne stil??

procedure TForm1.Button1Click(Sender: TObject);
const
  Image_width=640;
  Image_height=480;

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

    GetInfo;
  end;

// ImageData ??? ExtBmp.Info.bmBits ??

  ExtBmp.Destroy;
end;
Avatar billede hyrtwol Nybegynder
05. december 2004 - 19:32 #9
noget a la det her.....

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;
Avatar billede hyrtwol Nybegynder
05. december 2004 - 19:39 #10
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;
Avatar billede delphin Nybegynder
07. december 2004 - 12:56 #11
Tak for det! - nu går det noget hurtigere :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester