Gdi és multi-frame tiff képeket

GDI + és több képkocka képeket TIFF formátumban

Más raszteres grafikus formátumokkal ellentétben a TIFF (Tag Image File Format) formátum lehetővé teszi:

  • többfunkciós fájlokat hozhat létre
  • adja meg a mentett képben lévő bitek számát pixelenként
  • négy különböző tömörítési algoritmust használjon

A formátum rendkívül rugalmas. Kiválaszthatja a tömörítési algoritmust és a TIFF fájlba mentett minden egyes képkocka per pixelenkénti számát.

Ez a cikk a Visual FoxPro alkalmazások TIFF formátumával való együttműködésének minden aspektusát lefedi.

Grafikus formátumok konvertálása GDI + -ba

A GDI + segítségével könnyen konvertálhat képeket formátumról a másikra; ehhez a kép mentési funkcióhoz (pl. GdipSaveImageToFile) elegendő egyszerűen átadni a megfelelő codec ClsID-jét. A következő példa átalakítja a képet BMP formátumról TIFF formátumra.

GdipLoadImageFromFile függvény beolvassa az eredeti képet InputFile.bmp fájlt a számítógép memóriájában, és GdipSaveImageToFile függvény elmenti ezt a képet TIFF fájlként a OutputFile.tif. Ezek a függvények megkövetelik, hogy a fájlnevek null terminált karakterláncokként kerüljenek Unicode formátumba.

A GDI + kodekek ClsID értékeit a következő táblázat tartalmazza:

A grafikus formátum típusa

A ClsID bináris értéke

megjegyzés
Csak bináris ClsID értékeket használhat a Visual FoxPro kilencedik változatában. A korábbi verziókban a Windows API függvényt használva elvégezheti a táblázatban megadott ClsID karakter ábrázolás átalakítását binárisra.

A Microsoft figyelmeztet, hogy a ClsID kódek értékei eltérhetnek a GDI + könyvtár különböző verzióiban. Ezért célszerűbb a GdipGetImageEncodersSize és a GdipGetImageEncoders funkciók által biztosított speciális mechanizmust használni. Lehetővé teszi, hogy a kódolás grafikus formátumához megkapjuk a kodek ClsID értékét. Valószínűleg ilyen szükség lesz a Windows Vista rendszerben.

Az EncoderParameters felépítése

A fenti példában, ha a funkció hívás nem sugározzák GdipSaveImageToFile s EncoderParameters pointert a szerkezetet (ez az utolsó, negyedik paraméter funkció); Ahelyett, hogy NULL-t ad meg. Valójában a GDI + grafikus formátumban támogatott formátumokat egy másikra is át lehet alakítani, anélkül, hogy ezt a struktúrát felhasználnánk. De ha azt akarjuk, hogy ellenőrizzék a minőségi JPEG képet kell menteni, vagy ha létrehoz egy multi-frame TIFF fájlokat vagy TIFF fájlok tömörítési algoritmusok és ellenőrzik a színpaletta a képet, akkor kell használni EncoderParameters szerkezet kezeléséért codec paramétereket.

Valójában az EncoderParameters szerkezete egy beágyazott struktúrák tömbje. Ennek a struktúrának első mezője négy bájtot tartalmaz az egész érték tárolásához, amely meghatározza a benne lévő struktúrák számát. A beágyazott struktúrák mindegyike tartalmazza a következő mezőket:

név
mezők az MSDN-ben

Megadja, hogy a paraméter egy négy 32 bites, nem aláírt egész szám tömbje. Az első két szám egy frakciót, a második két szám a második frakciót jelenti. Ezek a frakciók a racionális számok körét reprezentálják. Az első frakció meghatározza a minimális és a második - a tartomány maximális értékét.

Munka közben a TIFF formátumban, a paraméter értéke a továbbított kodek egy 32 bites egész, de NumberOfValues ​​mező értéke mindig megegyezik az egység és a mező értéke Type - négy (EncoderParameterValueTypeLong, 32 bites előjel nélküli egész szám).

Az Érték mező egy mutatót tartalmaz annak a memóriaterületnek, amelyben a paraméter értéke található. A fentiek alapján a memória mérete 4 bájt lehet.
Megoszthatja a szükséges memóriát mind belsőleg, mind globálisan. Általában ez az utóbbi módszer.

Az alábbi táblázat bemutatja a multi-frame TIFF (az EncoderSaveFlag-t tartalmazó Guid mezővel) létrehozó struktúrában átadott paraméter megengedett értékeit:

Az MSDN konstans neve

Meghatározza, hogy új fájl kerüljön a fájlba

A következő kódrészlet bemutatja a EncoderParameters struktúra létrehozását a Visual FoxPro-ban.

A paraméterérték tárolásához a példában a GlobalAlloc funkció elosztja a fix, globális Windows memóriát.

Több képkocka képek felvétele TIFF formátumban

A többképernyős TIFF kép létrehozása kissé eltér a rendszeres fájl rögzítésétől. A legelső képkockát a szokásos módon a GdipSaveImageToFile függvény rögzíti. Minden egyes következő keret hozzáadásához használja a GdipSaveAddImage funkciót. és a függvény, a GdipSaveAdd játssza a végső akkord szerepét, hozzáadva a fájlhoz a végét. Mindezek a funkciók az EncoderParameters struktúrájára mutató mutatónak felelnek meg. míg a struktúrában átadott paraméterérték (a mutató a paraméterhez az Érték mezőben van tárolva) mindegyik funkció eltérő lesz:

EncoderValueMultiFrame - a GdipSaveImageToFile függvény számára

EncoderValueFrameDimensionPage - a GdipSaveAddImage függvény számára

EncoderValueFrameDimensionPage - a GdipSaveAdd funkcióhoz

Az 1. lista az eljárási kódot mutatja, amely több képkocka TIFF fájlt hoz létre.

Listázás 1. A multi-frame TIFF fájl létrehozásának eljárása

Az eljárás a Microsoft Common Dialog objektumot használja. Lehetővé teszi tetszőleges számú fájl kiválasztását a TIFF fájlba történő másoláshoz.

Miután elindította az eljárást, jelölje ki a megjelenő párbeszédablakban található fájlokat, majd a Mentés másként párbeszédablakban adja meg a TIFF fájl specifikációját (elérési útját és nevét), amelybe a kiválasztott képeket elhelyezik.

Kezdetben a Common Dialog által visszaadott lista első fájlját a memóriába olvassa. Ha csak egy fájlt választ ki, az EncoderParameters struktúra nem generálódik, és az lcEncoderParameters változó NULL értékre van állítva.
Ha több fájl van kijelölve, az információs struktúra kerül, amely meghatározza a kép felvételi mód (azaz a Guid lépett EncoderSaveFlag érték azt jelzi, azonosító látens módszer GDI +, létrehozásának szabályozása a multi-image, és a paraméter, egy mutatót, amely tárolja az Érték mezőben kap érték EncoderValueMultiFrame).

Ha a TIFF fájl van írva, hogy több, mint egy keret, akkor a függvény SYS (2600) érték helyébe EncoderValueFrameDimensionPage, ami után a ciklus egymás után olvassa be a memóriába más fájlokat a listából, GdipSaveAddImage függvény hozzáadja a beérkezett képeket a kimeneti fájlt.
Amikor minden forrásfájl feldolgozásra kerül, a GdipSaveAdd függvényt hívják. a végső bejegyzés a kimeneti fájlban. A funkció hívása előtt a struktúrában átadott paraméter értékét az EncoderColorDept helyettesíti.

A GdipDisposeImage függvény felszabadítja az olvasási kép által elfoglalt memóriát, és a GlobalFree funkció visszaküldi a struktúrában átadott paraméterhez rendelt Windows memóriát a GlobalAlloc függvénynek.

Többképernyős TIFF fájlok olvasása

Miután elolvasta a több képkocka TIFF fájlt a memóriába a GdipLoadImageFromFile függvény használatával, meg kell határoznia a dimenziók számát és az egyes dimenziók kereteinek számát.

megjegyzés
A GDI + TIFF fájlt hoz létre egyetlen dimenzióval; nyilvánvalóan más gyártók is létrehozhatnak többdimenziós TIFF-t.

Ezt a GdipImageGetFrameDimensionsCount, a GdipImageGetFrameDimensionsList és a GdipImageGetFrameCount függvényekkel végezzük.

Függvény A GdipImageGetFrameDimensionsCount visszaadja a TIFF fájl méreteinek számát:

A GdipImageGetFrameDimensionsList függvény tölti ki a tömböt a dimenziók GUID értékeivel. Mielőtt meghívná, létre kell hoznia egy sztringet a visszaküldött GUID-ek tárolásához (azaz ennek a stringnek a hosszúsága 16 byte-nak kell lennie, szorozva a TIFF-fájl méreteinek számával):

A TIFF fájl minden dimenziója tetszőleges számú keretet tartalmazhat. E keretek eléréséhez az lcDimensionIDs-ből egy speciális GUID hosszúságú 16 bájt hosszúságú stringet kell kivenni; Így az első dimenzió GUID-je a vonal első bájtjától kezdődik, a második dimenzió GUID-je a 17. bájttól indul stb.

A GdipImageGetFrameCount funkció visszaadja a kiválasztott dimenzió kereteinek számát:

Ha a GDI + által létrehozott TIFF-fájlból készít képeket, akkor a fenti függvények használata helyett az lcDimensionID előre definiált értékét használhatja.

mivel a GDI + egydimenziós TIFF fájlokat hoz létre.

A GdipImageSelectActiveFrame funkció mozgatja a mutatót azon a területen belül, ahol a kép betöltött a megadott keretre:

A blokkszám átkerül az nFrame változó függvényébe. A keretszámozás nulláról indul.

menthetjük azt a GdipSaveImageToFile vagy egyéb műveleteket hajthat végre, amelyek megengedett GDI + (felhívni a dobozban formák, kinyomtatni, akkor felhívni a keret, stb) a telepítés után egy mutatót a kívánt keretet.

A 2. lista az eljárási kódot mutatja, amely a TIFF-fájlból képeket kinyer

Listázás 2. Az eljárás több képkocka TIFF fájlból történő képkivonásra

Miután elindította az eljárást a Megnyitás párbeszédpanelen. hívja a GetFile () függvényt, válassza ki a TIFF fájlt, majd a Getdir () függvény által meghívott párbeszédablakban adja meg a mappát, amely a keretet külön fájlként mentheti.
Az eljárás PNG fájlokba rendezi a képkockákat, hozzárendelve a "OutputNM.png" nevet, ahol az "N" a méretszám, és az "M" a keretszám a dimenzióban.

Compressziós algoritmusok használata

TIFF formátumban az alábbi tömörítési algoritmusok valamelyikét használhatja:

Név az MSDN-ben

Nincs tömörítés

GDI + esetén az alapértelmezett tömörítési algoritmus LZW. A CCITT3, CCITT4 és Rle algoritmusok csak fekete-fehér (fekete-fehér) monokróm fájlokra alkalmazhatók, amelyekben egy bitet tárol a pixel tárolására.

Alapértelmezés szerint a GDI + LWZ tömörítést használ. Ha törölni kívánja a tömörítést vagy más algoritmust használ, add hozzá egy beágyazott struktúrát az EncoderParameters struktúrához, amelynek Guid mezője EncoderCompression.

megjegyzés
Az LWZ tömörítési hatékonysággal kapcsolatos algoritmusa hasonló a JPEG-hez; A képminőség ezzel a tömörítéssel elvész. Ezért, ha magas minőségű képeket szeretne tartani, ne tömörítse azt.

A következő kódfájl az EncoderParameters struktúra kialakítását mutatja, hogy létrehozza a több képkocka TIFF-et a forrásfájlok tömörítése nélkül.

Amint látja, minden egyes beágyazott struktúra esetében a globális Windows-memória kiosztásra kerül; az elosztott blokkok mutatói a hGlobalMulti és a hGlobalCompr változókban tárolódnak. Ne felejtse el visszaadni ezt a memóriát a TIFF fájl létrehozása után!

A pixelenkénti bitek számának ellenőrzése

Nem minden grafikus formátum támogatja az információ tárolását tetszőleges számú bitre pixelenként. Talán az egyetlen kivétel a PNG formátum. Abban az esetben, ha a megadott számú bit / pixel nem érvényes, akkor a végrehajtás során hiba lép fel a 2. kóddal (az elavult paraméter érvénytelen értéke).

A pixelenkénti bitek számának ellenőrzéséhez hozzá kell adnia egy beágyazott struktúrát az EncoderParameters struktúrához, rendelve az EncoderColorDept értéket a Guid mezőhöz. Szintén hozzárendeljen ehhez a struktúrához egy memóriablokkot, amelynek mutatója az érték mezőbe kerül. Írja le a pixelenkénti bitek számát az elosztott memóriára.