Imagini GDI + și mai multe cadre în format TIFF
Spre deosebire de alte formate grafice raster, formatul TIFF (Tag Image File Format) permite:
- creați fișiere multiframe
- specificați numărul de biți per pixel din imaginea salvată
- utilizați patru algoritmi de compresie diferiți
Formatul are o flexibilitate excepțională. Puteți selecta algoritmul de compresie și numărul de biți per pixel pentru fiecare cadru salvat în fișierul TIFF.
Acest articol acoperă toate aspectele legate de lucrul cu formatul TIFF din aplicațiile Visual FoxPro.
Conversia formatelor grafice la GDI +
GDI + vă permite să convertiți ușor imagini dintr-un format în altul; pentru această funcție de salvare a imaginii (de exemplu, GdipSaveImageToFile), este suficient să treceți pur și simplu codul ClsID al codecului corespunzător. Următorul exemplu convertește o imagine din format BMP în format TIFF.
Funcția GdipLoadImageFromFile citește imaginea originală de fișier InputFile.bmp în memoria calculatorului și funcția GdipSaveImageToFile salvează această imagine ca un fișier TIFF în OutputFile.tif. Aceste funcții necesită ca numele fișierelor să le fie transmise ca șiruri null terminate în format Unicode.
Valorile ClsID ale codecurilor GDI + sunt enumerate în următorul tabel:
Tipul formatului grafic
Valoarea binară a ClsID
remarcă
Puteți utiliza numai valorile binare ClsID în noua versiune a Visual FoxPro. În versiunile anterioare, trebuie să utilizați funcția Windows API pentru a efectua conversia reprezentării de caractere ClsID specificată în tabel la binar.
Microsoft avertizează că valorile codecurilor ClsID pot diferi în diferite versiuni ale bibliotecii GDI +. Prin urmare, este mai adecvat să folosiți mecanismul special furnizat de funcțiile GdipGetImageEncodersSize și GdipGetImageEncodders. Acesta permite obținerea valorii ClsID a codecului pentru formatul grafic dat al imaginii. Cel mai probabil, o astfel de nevoie va apărea în Windows Vista.
Structura EncoderParameters
In exemplul de mai sus, în cazul în care apelul funcției nu este transmis GdipSaveImageToFile s EncoderParameters pointer la structura (această ultimă, a patra funcție parametru); NULL este specificat. Într-adevăr, puteți converti orice format suportat în GDI + într-un alt format și fără a utiliza această structură. Dar dacă doriți să controlați calitatea imaginii JPEG pentru a fi salvat, sau dacă un multi-cadru fișiere TIFF sau fișiere TIFF, folosind algoritmi de compresie și de a controla paleta de culori a imaginii, atunci ar trebui să utilizați structura EncoderParameters pentru gestionarea parametrilor codec.
De fapt, structura EncoderParameters este o serie de structuri imbricate. Primul câmp al acestei structuri conține patru octeți pentru stocarea unei valori întregi care determină numărul de structuri încorporate în ea. Fiecare dintre structurile imbricate conține următoarele câmpuri:
nume
domenii în MSDN
Specifică faptul că parametrul este o matrice de patru întregi nesemnate pe 32 de biți. Primele două numere reprezintă o fracțiune, iar cele două numere reprezintă a doua fracțiune. Aceste fracții reprezintă o serie de numere raționale. Prima fracțiune determină minimul, iar a doua - valoarea maximă a intervalului.
Atunci când se lucrează cu formatul TIFF, valoarea parametrului a codec-ului transmis este unul de 32 de biti, cu toate acestea NumberOfValues valoare de câmp trebuie să fie întotdeauna egală cu unitatea și valoarea tipul câmpului - patru (EncoderParameterValueTypeLong, pe 32 de biți întreg fără semn).
Câmpul Value conține un indicator pentru zona de memorie în care este localizată valoarea parametrului. După cum rezultă din cele de mai sus, dimensiunea acestei memorii ar trebui să fie de 4 octeți.
Puteți aloca memoria necesară atât la nivel intern, cât și la nivel global. Prefer de obicei ultima metodă.
Următorul tabel prezintă valorile admise ale parametrului trecut în structura care controlează crearea unui TIFF multi-frame (cu câmpul Guid conținând EncoderSaveFlag):
Numele constantei în MSDN
Specifică faptul că un fișier nou este adăugat la fișier
Următorul fragment de cod demonstrează modul de creare a structurii EncoderParameters din Visual FoxPro.
Pentru a stoca valoarea parametrului din exemplu, funcția GlobalAlloc distribuie memoria globală fixă Windows.
Înregistrarea imaginilor în mai multe cadre în format TIFF
Crearea unei imagini TIFF cu mai multe cadre este puțin diferită de înregistrarea unui fișier obișnuit. Primul cadru, ca de obicei, este înregistrat de funcția GdipSaveImageToFile. Pentru a adăuga fiecare cadru următor, utilizați funcția GdipSaveAddImage. iar funcția GdipSaveAdd joacă rolul coardei finale, adăugând fișierului un semn al încheierii acestuia. Toate aceste funcții sunt transmise unui pointer la structura EncoderParameters. în timp ce valoarea parametrului trecută în structură (indicatorul pentru parametru este stocată în câmpul Valoare) pentru fiecare dintre aceste funcții va fi diferită:
EncoderValueMultiFrame - pentru funcția GdipSaveImageToFile
EncoderValueFrameDimensionPage - pentru funcția GdipSaveAddImage
EncoderValueFrameDimensionPage - pentru funcția GdipSaveAdd
Lista 1 prezintă codul procedurii care creează un fișier TIFF cu mai multe cadre.
Listarea 1. Procedura de creare a unui fișier TIFF cu mai multe cadre
Procedura utilizează obiectul Microsoft Dialog obișnuit. Vă permite să selectați un număr arbitrar de fișiere pentru a copia într-un fișier TIFF.
După ce a început procedura pentru a efectua selectați în caseta de dialog File de dialog comună, și apoi, în caseta de dialog Salvare ca, specificați caietul de sarcini (calea și numele) de fișier TIFF, care va fi plasat imaginile selectate.
Inițial, primul fișier din lista returnat de dialogul comun este citit în memorie. Dacă este selectat un singur fișier, structura EncoderParameters nu este generată și variabila lcEncoderParameters este setată la NULL.
Dacă sunt selectate mai multe fișiere, structura de informații este plasat, care determină modul de înregistrare a imaginii (adică în GUID introdus valoarea EncoderSaveFlag indicând identificatorul metodei latente GDI +, crearea de control al multi-imagine, și parametrul, un pointer la care este stocat în câmpul Valoare devine valoare EncoderValueMultiFrame).
Dacă fișierul TIFF este scris la mai mult de un cadru, apoi folosind SYS funcția (2600), valoarea se înlocuiește cu EncoderValueFrameDimensionPage, după care urmează un ciclu de secvențial citit în memoria alte fișiere din listă, funcția GdipSaveAddImage adaugă imaginile recepționate în fișierul de ieșire.
Când toate fișierele sursă sunt procesate, funcția GdipSaveAdd este apelată. intrarea finală în fișierul de ieșire. Înainte de a apela această funcție, valoarea parametrului trecut în structură este înlocuită cu EncoderColorDept.
Funcția GdipDispunereImage eliberează memoria ocupată de imaginea citită și funcția GlobalFree returnează memoria Windows alocată pentru parametrul transmis în structură funcției GlobalAlloc.
Citirea fișierelor TIFF cu mai multe cadre
După ce ați citit în memorie un fișier TIFF cu mai multe cadre utilizând funcția GdipLoadImageFromFile, trebuie să determinați numărul de dimensiuni și numărul de cadre din fiecare dimensiune.
remarcă
GDI + creează un fișier TIFF cu o singură dimensiune; aparent, alți producători pot crea TIFF multidimensional.
Acest lucru se face cu ajutorul funcției GdipImageGetFrameDimensionsCount, GdipImageGetFrameDimensionsList și GdipImageGetFrameCount.
Funcția GdipImageGetFrameDimensionsCount returnează numărul de dimensiuni ale fișierului TIFF:
Funcția GdipImageGetFrameDimensionsList umple matricea cu valori GUID ale dimensiunilor. Înainte de a o apela, trebuie să creați un șir pentru a stoca GUID-urile returnate (adică lungimea acestui șir trebuie să fie 16 octeți, înmulțită cu numărul de dimensiuni ale fișierului TIFF):
Fiecare dimensiune a unui fișier TIFF poate conține un număr arbitrar de cadre. Pentru a accesa aceste cadre, trebuie să extrageți din lcDimensionIDs un șir cu o lungime de 16 octeți dintr-un anumit GUID; Astfel, GUID-ul primei dimensiuni este localizat începând de la primul octet al liniei, GUID-ul celei de-a doua dimensiuni este localizat începând de la cel de-al 17-lea octet etc.
Funcția GdipImageGetFrameCount returnează numărul de cadre ale dimensiunii selectate:
Dacă doriți să extrageți cadre dintr-un fișier TIFF creat de GDI +, atunci, în loc să utilizați funcțiile discutate mai sus, puteți utiliza valoarea predefinită pentru lcDimensionID.
deoarece GDI + creează fișiere TIFF unidimensionale.
Funcția GdipImageSelectActiveFrame deplasează cursorul în interiorul zonei în care imaginea este încărcată în cadrul specificat:
Numărul blocului este trecut la funcția din variabila nFrame. Numerotarea cadrelor începe de la zero.
îl puteți salva folosind GdipSaveImageToFile sau efectua alte acțiuni care sunt permise în GDI + (trage în formele caseta, imprimați, desenați pe acel cadru, etc.), după instalarea unui pointer la cadrul pe care doriți.
Listing 2 arată codul de procedură care prelucrează cadre dintr-un fișier TIFF
Listing 2. Procedura de extragere a cadrelor dintr-un fișier TIFF cu mai multe cadre
După pornirea procedurii în caseta de dialog Deschidere. apelați funcția GetFile (), selectați fișierul TIFF și apoi în caseta de dialog care este apelată de funcția Getdir (), specificați directorul pentru a salva cadrele ca fișiere separate.
Procedura salvează cadre în fișiere PNG, atribuindu-le numele "OutputNM.png", unde "N" este numărul de dimensiune, iar "M" este numărul de cadru din dimensiune.
Utilizarea algoritmilor de compresie
Pentru formatul TIFF, puteți utiliza unul dintre următorii algoritmi de compresie:
Nume în MSDN
Fără comprimare
În GDI +, algoritmul implicit de compresie este LZW. Algoritmii CCITT3, CCITT4 și Rle pot fi aplicați numai fișierelor monocrome (alb-negru), în care un bit este utilizat pentru stocarea pixelului.
În mod implicit, GDI + utilizează compresia LWZ. Dacă doriți să anulați compresie sau de a folosi un algoritm diferit, apoi se adaugă structura EncoderParameters structură arborescentă, câmpul este setat valoarea Guid EncoderCompression.
remarcă
Algoritmul LWZ privind eficiența comprimării este comparabil cu JPEG; Calitatea imaginii prin această comprimare este pierdută. Prin urmare, dacă aveți nevoie să mențineți imagini de înaltă calitate, nu comprimați-le.
Următorul fragment de cod prezinta structura EncoderParameters de formare pentru a crea un sistem multi-cadru fișierele sursă TIFF necomprimat.
După cum puteți vedea, pentru fiecare structură imbricată, memoria globală Windows este alocată; indicatorii pentru blocurile distribuite sunt stocate în variabilele hGlobalMulti și hGlobalCompr. Nu uitați să returnați această memorie după crearea fișierului TIFF!
Controlarea numărului de biți per pixel
Nu toate formatele grafice suportă capacitatea de a stoca informații într-un format cu un număr arbitrar de biți per pixel. Poate că singura excepție este formatul PNG. În cazul în care numărul specificat de biți per pixel este nevalid, atunci execuția va returna un cod de eroare 2 (valoare incorectă a parametrului transmis).
Pentru a controla numărul de biți per pixel, ar trebui să adăugați la structură arborescentă structura EncoderParameters prin atribuirea EncoderColorDept domeniul său de valoare Guid. De asemenea, alocați pentru această structură un bloc de memorie, indicatorul căruia este plasat în câmpul Valoare. Scrieți valoarea numărului de biți pe pixel în memoria distribuită.