Domanda

Mi piacerebbe usare libtiff per accedere molto grandi file TIFF. Ho bisogno di funzioni come più pagine e piastrelle, e così libtiff sembra essere la strada giusta da percorrere. Qualcuno mi può aiutare su come utilizzare libtiff da C #? Ho trovato alcuni link (come blog.bee-ee che conteneva il codice parziale. Ma io couln't andare oltre ottenere una versione. ho guardato FreeImage ma abbiamo trovato non è adatto (immagini sono circa 800 MPixel 8 o 16 bit in scala di grigi -.> 800-1600 MByte) dimensioni e non riesco a caricare in memoria in un 32- ambiente bit)

Sono molto sperimentato in C / C ++, ma non ancora in C #. Qualcuno mi può aiutare a un involucro o qualche suggerimento?

Nota: ho bisogno di pagine per accedere a piani piramidali (multi-risoluzione) in un file TIFF, e piastrelle di 256x256 ad avere un rapido accesso a diverse parti dell'immagine senza caricarla in una sola volta.

[Modifica] La LibTIFF.NET soluzione sembrava più pratica per me. Ora sto integrando in uno sviluppo del prodotto, e sarà stata riordinata me risparmiare un sacco di mal di testa di andare in / out di memoria gestita. Non ho ancora provato la funzionalità 'callback', che sembra essere risolto in un modo ben NET. Grazie per l'aiuto su StackOverflow [/ Modifica]

È stato utile?

Soluzione

È possibile provare il nostro LibTiff.Net. E 'la versione libero e open source di libtiff scritto utilizzando C #. API di nostra implementazione tenuto molto simile a quella di originale.

http://bitmiracle.com/libtiff/

Abbiamo appena rilasciato esso, così ci possono essere errori. Ma il codice sorgente completo viene fornito con un certo numero di prova, così gli insetti più evidenti dovrebbe essere risolto.

Altri suggerimenti

WIC fornisce il supporto per i grandi file di immagini. C'è un bel involucro per esso nel .NET framework:. TiffBitmapDecoder

La mia soluzione iniziale era quello di utilizzare un C # .NET wrapper per il libtiff DLL. Ho trovato su libtiff ftp . Sembra di contenere tutti i metodi importanti della biblioteca libtiff. Mantiene memoria nella memoria non gestita libtiff; questo significa che il codice C # deve essere consapevole di questo e copiare i dati quando è necessario essere elaborati nel codice di sicurezza.

Il mio 'codice di lettura tegola' per provarlo leggere come

if (LibTIFF.IsTiled(tiff))
{
    if (LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILEWIDTH, out tileWidth) &&
        LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILELENGTH, out tileLength))
    {
        uint tiles = 0;
        IntPtr pTile = LibTIFF._malloc((int)(tileLength*tileWidth*bitsPerSample/2));
        for (uint y = 0; y < imageLength; y += tileLength)
        {
            for (uint x = 0; x < imageWidth; x += tileWidth)
            {
                LibTIFF.ReadTile(tiff, pTile, x, y, 0, 0);
                tiles++;
            }
        }                        
        LibTIFF._free(pTile);   
    }
}

andrò per la porta NET di libtiff però, ma questa soluzione può essere quella giusta per altre persone, quindi lo lascio su StackOverflow.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top