[delphi] raw data omzetten naar bmp

Pagina: 1
Acties:
  • 328 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 29-09 15:25
Ik heb een plaatje van 504x350 pixels, raw data en het palette ervoor in een "array [1..256,1..3]" (of "array [1..768]" en daar wil ik een bmp van maken...
Hoe kan ik dit het makkelijkste doen?
Ik heb het nu dat ie de raw data in een "array [1..350,1..504]" plaatst en dat van "350 downto 1" in een bmp schrijft, met eerst de bmp header natuurlijk, maar dit is vrij traag.

Suggesties?

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Je *zou* het blok geheugen waar dat array in staat in 1x kunnen dumpen naar die BMP. Je moet alleen wel zeker weten dat je het geheugen op de BMP-manier hebt ingedeeld.
Desnoods maak je eerst de BMP aan in een blok geheugen, en dump je die naar het bestand.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 29-09 15:25
Ik hoef niet perse een BMP ervan te maken hoor, ik wil em alleen op het scherm laten zien.
Het probleem met een BMP is dat ie van onder naar boven wordt ingelezen

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • yodax
  • Registratie: Januari 2000
  • Laatst online: 11-08 03:06
Ik kan je hier niet mee helpen, maar ik heb wel een vraag. Waarom hebben ze dat zo ontworpen? (dat hij van onder naar boven word gelezen?)

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Op het scherm laten zien? Dan maak je toch een TImage ofzoiets, en dan ga je fijn in een dubbel loopje de pixels invullen?
code:
1
2
3
4
5
   for x:=1 to 300 do begin
    for y:=1 to 200 do begin
       Image.Bitmap[x,y]:=JeArray[x,y]
    end;
   end;

Zoiets dan he.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

Verwijderd

Op woensdag 18 juli 2001 09:19 schreef Varienaja het volgende:
Op het scherm laten zien? Dan maak je toch een TImage ofzoiets, en dan ga je fijn in een dubbel loopje de pixels invullen?
code:
1
2
3
4
5
   for x:=1 to 300 do begin
    for y:=1 to 200 do begin
       Image.Bitmap[x,y]:=JeArray[x,y]
    end;
   end;

Zoiets dan he.
Dat is Traaaaaaaaaaaaaaaag.. je eerste idee is beter..

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Op woensdag 18 juli 2001 09:13 schreef yodax het volgende:
Waarom hebben ze dat zo ontworpen? (dat hij van onder naar boven word gelezen?)
Je moet toch wat? En als je je als programmeur verveelt, dan verzin je gewoon wat geks.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Op woensdag 18 juli 2001 09:20 schreef cartman3380 het volgende:
Dat is Traaaaaaaaaaaaaaaag.. je eerste idee is beter..
Ik weet niet of dat wel zo traag is. Een vriend van me tekende op zo'n soort manier 3d-draadmodellen met 100FPS in delphi. Hij had wel allerlei optimalisaties met double-buffering etc. aangezet.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

Verwijderd

mmm die array is dat een integer ?
die kun je met een copy() gewoon in een ander stuk geheugen copien..
maar waarom point je niet gewoon een TImage naar dat stuk geheugen? een array staat altijd achter elkaar in het geheugen.
dat pallete kun je er dan later aan toe-wijzen met een api call.

Acties:
  • 0 Henk 'm!

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

Hoe je het pallet moet opslaan staat wel in de delphi help. Als je zoekt op TPalette vind je het wel. (bij Find, niet bij Index)

Een rappe manier om die array in de bitmap te krijgen is mbv ScanLine pointers. Zoek daar maar eens om. Daarmee kun je heel wat fps'jes krijgen (maar ik geloof niet dat je fps'jes nodig hebt bij je proggel.. whatever)

Acties:
  • 0 Henk 'm!

  • codebeat
  • Registratie: Januari 2010
  • Laatst online: 21-08 05:47
yodax schreef op woensdag 18 juli 2001 @ 09:13:
Ik kan je hier niet mee helpen, maar ik heb wel een vraag. Waarom hebben ze dat zo ontworpen? (dat hij van onder naar boven word gelezen?)
Omdat er meestal met een while-loop wordt gewerkt, dat is veelal sneller dan een andere soort loop. Bijvoorbeeld in C:
int Y = 199;
while( Y-- ) {

/* scanline[Y] */
}

De loop stopt bij 0 omdat 0 ook staat voor false, is het getal hoger dan 0 dan zou je dit kunnen als zien als while( TRUE ) ( Y > 0 ) en bij 0 while( FALSE ) ( Y == 0 ). Omdat een while loop dat deze alleen start als de conditie tussen haakjes WAAR is. Dus zal de loop automatisch stoppen als deze niet waar is. Je ziet dat een hele korte notatie is een dus een efficiënte manier van programmeren, levert korte machine code op. Daarom dus achterstevoren. Het wordt achterstevoren weggeschreven waarna het achterstevoren weer wordt ingelezen en dan staat het dus weer goed 8)

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Jij gaat voor de GoT-award hardste kick van de eeuw?

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
8)7

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.