Het hol van de Code

31 maart, 2006

Het behandelen van geladen JPEG van een TImage als Bitmap in Delphi

Filed onder: Het 11:15 p.m. van Delphi - van Brian @

Één probleem met de component TImage is dat het natively geen JPegs steunt. JPeg was enkel als populair geen formaat terug in vroege aan het midden van de jaren '90 toen Delphi eerst werd ontwikkeld. Goed, vandaag is dat een verschillend verhaal. Beginnend met Delphi 3, als het geheugen (ik niet elk gebruik D2) dient, werd de component TJPegImage geïntroduceerd en TImage zou kunnen worden uitgebreid om JPegs toe te laten om worden geladen. De component TImage van vandaag kan een JPeg van het bevel rechtstreeks laden LoadFromFile. Nochtans, kunt u nog niet zo gemakkelijk direct gemanipuleerd het aangezien u BitMap kunt. Dit is duidelijk als u de structuur van het bezit van het Beeld van een TImage bekijkt.

Een TPicture heeft een BitMap bezit en een bezit van het Metadossier en een Grafisch bezit dat alles opslaat die BitMap of geen metadossier is.

Maar toch zult u zien snel dat zeer weinig routines en voorbeeld op het Web het Grafische bezit behandelen. Zij kunnen niet! De structuur van de informatie in Grafisch variÃërt het afhangen van het type van beeld.

Zo, moet de truc van het behandelen van JPegs, of iets anders als TIFFs, GIFS of Targa (mijn oh), hun gegevens niet samengedrukt en DE-doorweven krijgen en terug over aan het bitmap bezit. Is het EEN WEINIG bekende feit dat dit is precies wat de Vensters moet doen wanneer u een JPEG als achtergrond kiest. De vensters zullen JPEG bewaren het aan BMP en schrijven de naam van dat BMP aan de registratie en dan de vertoning dat dossier in plaats van originele JPEG laden. Zo, zouden wij allen moeten ophouden met beschuldigend Borland (DevCo) van een klunky controle, doen zij het de juiste lage manier. En namelijk toch wat wij houden ongeveer van het recht van Delphi?

Zo, is wat wij moeten doen zodra wij een gebruiker toestaan om een dossier te laden, zullen wij controleren om te zien of is het type een TJPegImage. Als het is, dan creëren wij een component TJPegImage. Wij wijzen dan JPegImage aan het BitMap bezit toe en wij worden gedaan! U kunt tot de beeldgegevens in BitMap nu toegang hebben.

In Delphi, dat als dit kijkt:

DELPHI:
  1. SourceImage.Picture.LoadFromFile (FullFileName);
  2.     als (SourceImage.Picture.Graphic is TJPegImage)
  3.     dan begin
  4.       JpegImage: = TJpegImage.Create;
  5.       probeer
  6.         JpegImage.Assign (SourceImage.Picture.Graphic);
  7.         SourceImage.Picture.Bitmap.Assign (JpegImage);
  8.       tot slot
  9.       eind;
  10.       FreeAndNil (JpegImage);
  11.     eind;

Wijs is een prachtige kleine zwarte doosfunctie die in vele voorwerpen wordt gebouwd toe. Wijs is één van de keurigste functies in Delphi toe. Het keurt fundamenteel andere types van voorwerpen als parameter goed, en zet zo veel van dat type van voorwerp om mogelijk.

Ga abstract en zeg u hebben twee objecten types TCar en TSuitCase.
C: TCar
S: TSuitcase

Kan duidelijk geen S zeggen: = C; of C: = S; omdat zij van verschillende types zijn.
Nochtans kunt u zeggen
C.Assign
en binnen TCar wijs methode toe hebben een verklaring die als kijkt:

DELPHI:
  1. als (de Bron is TSuitcase)
  2. dan Self.Trunk.Contents: = Self.Trunk.Contents + TSuitcase (Bron). Inhoud
  3. als anders (de Bron is TGasolinePump)
  4. dan…

O.K., dat vrij niet-opwekt klinkt, maar het wordt beter! Wat als het type van voorwerp onbekend is? Kan de routine TCar het weten hoe te om een TFordPerfect aan zich toe te wijzen omdat een TFordPerfect van TCar erft, maar gaat niet een TCar hoe te om een TFordPrefect aan zich nu is het toe te wijzen het weten? Dat is waar AssignTo in… komt

DELPHI:
  1. als (de Bron is TSuitcase)
  2. dan Self.Trunk.Contents: = Self.Trunk.Contents + TSuitcase (Bron). Inhoud
  3. als anders (de Bron is TGasolinePump)
  4. dan Self.Tank.Contents: = Self.Tank.Contents + TGasolinePump (Bron). Gallons [1]
  5. anders Source.AssignTo (Zelf);

AssignTo gaat precies de TEGENOVERGESTELDE richting. De persoon die de nieuwe component schrijft dan creÃërt dan een routine die zijn nieuwe component aan de gemeenschappelijkste componenten zal toestaan die reeds bestaan. Zo na ons voorbeeld, zou de routine van AssignTo van TFordPrefect iets in die aard kunnen omvatten:

DELPHI:
  1. als (Dest is TCar)
  2. dan TCar (Dest) .PassengerCompartment: = TCar (Dest) .PassengerCompartment + TPassenger (Zelf);
  3.  
  4. .

Of in het geval van een TJPegImage, zien de AssignTo methodecontroles aan of is Dest var een TBitmap, en of is het, het door een lange decompressie en omzettingsroutine een ware Onafhankelijke het beetjekaart van het Apparaat gaat definitief produceren en die ruwe beetjes schrijven in Dest.

En dat mijn vrienden hoe is krijgt onze component TImage, die niets over JPEG aan Bitmap omzettingen kent de baan gedaan. Het vraagt de methode van TJPegImage AssignTo om allen te doen als zijn werk voor het.

U kunt het beeld nu gebruiken Picture.BitMap normaal. Het keurige ding is dat u die routines in uw methode kunt zetten FormCreate. Zo, kan TImages worden gemaakt om JPEGs in ontwerptijd te bevatten, die uw EXE kleiner maakt beduidend. En dan zet het hen, indien nodig, in BMPs om bij Runtime. Het is aardig om te besparen 600.000 van beeldplaats bij naast geen kosten.

Soort handige eh?

(BTW als u werkelijk ambitieus bent, ben ik zeker u die routine kon schrijven hierboven zodat het controleert om grafisch ervoor te zorgen bent geen BMP, gebruikt WMF of leeg en dan de routines van klasseninfo om het type van voorwerp en instationate een variabele te verzoeken TPersistent om een voorwerp van dat type te bevatten. Dan kan uw routine als bitmap OM HET EVEN WELK beeldtype behandelen u uw TImage om hebt uitgebreid te bevatten. Meer bij later het uitbreiden van TImages…)

Geen Commentaren “

Geen commentaren nog.

Voer RSS voor commentaren op deze post. TrackBack URL

Verlaat een commentaar

Aangedreven door WordPress