Avatar billede friiiiis Novice
29. januar 2009 - 20:16 Der er 9 kommentarer og
1 løsning

Problemer med bitmap

Hej!

Jeg vil gerne lave nogle kontour grafer i delphi. Det har jeg lavet; det virker fint og koden er:

var
i,k :integer;
Bmp :TBitmap;
begin

Bmp := TBitmap.Create;
Bmp.Height := 1200;
Bmp.width := 1200;

for i := 0 to 1200-1 do
  for k := 0 to 1200-1 do
    BmpSkovtrold.Canvas.pixels[i,k] :=
    CoolColerCode(Temperatur[i,k]);

//Funktionen CoolColorCode laver en temperaturværdi om til en
// passende farve: CoolColorCode(var x:extended):TColor

Image1.Width := Bmp.width;
Image1.Height := Bmp.Height;

Image1.Canvas.Draw(0,0,Bmp);

Bmp.FreeImage;


Problemet er at det dels er noget langsomt samt at jeg får fejlen "EOutOfResources" - altså systemet opbruger alt RAM på computeren som jeg forstår det... men jeg har jo brugt freeimage?

Spørgmål:

1) Hvordan kan jeg gøre det hurtigere (f.eks. med scanline??)
2) Hvordan undgår jeg fejlen EOutOfResources ?
Avatar billede friiiiis Novice
29. januar 2009 - 20:17 #1
"BmpSkovtrold.Canvas.pixels[i,k]" i for-løkken skal selvfølgelig være

Bmp.Canvas.pixels[i,k]
Avatar billede eht Nybegynder
29. januar 2009 - 22:00 #2
Mon ikke det er nede i CoolColorCode-funktionen problemet ligger.
Det her giver i hvert fald ingen problemer her.


procedure TForm4.Button1Click(Sender: TObject);
var
i,k :integer;
Bmp :TBitmap;
begin

Bmp := TBitmap.Create;
Bmp.Height := 1200;
Bmp.width := 1200;

for i := 0 to 1200-1 do
  for k := 0 to 1200-1 do
    Bmp.Canvas.pixels[i,k] := random(1000000);
  // CoolColerCode(Temperatur[i,k]);

Image1.Width := Bmp.width;
Image1.Height := Bmp.Height;

Image1.Canvas.Draw(0,0,Bmp);

Bmp.Free; //jeg bruger normalt Free i stedet for Freeimage. Jeg tror nu ikke det gør nogen forskel her.
end;
Avatar billede friiiiis Novice
30. januar 2009 - 12:34 #3
Jeg skal måske nævne at ovenstående kode nemt kan blive kaldt 100 - 1000 gange i løbet af en programkørsel...

Jeg er lidt fatsvag eht... pixels[i,k] tager da en TColor og ikke en Random... hvordan fungerer det???
Avatar billede eht Nybegynder
30. januar 2009 - 12:57 #4
Hej Friiiis

Enhver TColor kan også opfattes som en talværdi (integer), vist nok inden for et vist interval. Det husker jeg ikke lige.

Delphi har med andre ord ikke noget problem med at man laver et regnestykke med farver, f.eks.  clBlue + clRed + 1000, da clRed og clBlue bare opfattes som tal.

Random returnerer en tilfældig talværdi indenfor et angivent interval.
Og da random returnerer en talværdi, kan man også bruge den til at angive en tilfældig TColor.

Der er sikkert lidt mere teori bag det. Jeg har ikke styr på det hele selv.
Avatar billede eht Nybegynder
30. januar 2009 - 13:01 #5
Prøv f.eks. at sætte en SpinEdit ind på en form.
Sæt increment til f.eks 1000
og så denne kode:

procedure TForm4.SpinEdit1Change(Sender: TObject);
begin
color := spinedit1.value
end;

Og vælg så forskellige værdier.
Avatar billede mbsnet Nybegynder
31. januar 2009 - 23:01 #6
bemærk: "EOutOfResources" kan opstå hvis der er problemer med det "handle" som er tilknyttet, og behøver derfor også opstå, selvom der er ressourcer til rådighed.
Avatar billede mbsnet Nybegynder
31. januar 2009 - 23:02 #7
behøver=kan
Avatar billede friiiiis Novice
01. februar 2009 - 09:52 #8
type
  TRGB32 = packed record
    B, G, R, A: Byte;
end;
  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
  PRGB32Array = ^TRGB32Array;

Procedure TForm1.MakeBitmap;
var
i,k :integer;
Bmp :TBitmap;
Line : PRGB32Array;
R,G,B :byte;
begin

Bmp := TBitmap.Create;
Bmp.PixelFormat := pf32bit;
Bmp.Height := 600;
Bmp.width := 1200;

R := 0;
G := 0;
B := 0;

for k := 0 to 600-1 do
  begin
    Line := Bmp.ScanLine[k];
    for i := 0 to 1200-1 do
      begin
        CoolColorCodeRGB(Temperatur[i,k],R,G,B);
        Line[i].B := B;
        Line[i].G := G;
        Line[i].R := R;
        Line[i].A := 0;
      end;
  end;
//CoolColorcodeRGB(x:extended;var R,G,B :byte) konverterer en temperaturværdi om
//til en passende farve RGB værdier

Image7.Width := Bmp.width;
Image7.Height := Bmp.Height;

Image7.Canvas.Draw(0,0,Bmp);
Image7.Invalidate;

Bmp.FreeImage;

end;
Avatar billede friiiiis Novice
01. februar 2009 - 09:55 #9
Ovenstående kode virker mere stabil - bryder ihvertfald ikke ned...

Burde også være hurtigere med det kan jeg ikke lige vurdere... syn's det ikke...

Omkring scanline så se: http://dn.codegear.com/article/29173
Avatar billede friiiiis Novice
03. maj 2011 - 17:51 #10
lukker
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