Domanda

Sto cercando di generare un file TIFF multipagina da un'immagine esistente utilizzando da Bob Powell :

picture.SelectActiveFrame(FrameDimension.Page, 0);
var image = new Bitmap(picture);
using (var stream = new MemoryStream())
{
    ImageCodecInfo codecInfo = null;
    foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders())
    {
        if (imageEncoder.MimeType != "image/tiff") continue;
        codecInfo = imageEncoder;
        break;
    }
    var parameters = new EncoderParameters
    {
        Param = new []
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame)
        }
    };
    image.Save(stream, codecInfo, parameters);

    parameters = new EncoderParameters
    {
        Param = new[]
        {
            new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage)
        }
    };
    for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++)
    {
        picture.SelectActiveFrame(FrameDimension.Page, i);
        var img = new Bitmap(picture);
        image.SaveAdd(img, parameters);

    }

    parameters = new EncoderParameters
    {
        Param = new[] 
        {
            new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush) 
        }
    };
    image.SaveAdd(parameters);
    stream.Flush();
}

Ma non funziona (solo il primo fotogramma è incluso nell'immagine) e non so perché.

Quello che voglio fare è quello di cambiare un particolare fotogramma di un file TIFF (aggiungere annotazioni ad esso).

Non so se c'è un modo più semplice per farlo, ma quello che ho in mente è quello di creare un TIFF multipagina dalla foto originale e aggiungere la mia immagine al posto di quella cornice.

È stato utile?

Soluzione 2

Sembra che questo processo non cambia oggetto immagine ma cambia il flusso in modo dovrei ottenere il buffer di flusso di memoria e costruire un altro oggetto immagine:

var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}

Ora provocare includerà tutti i fotogrammi.

Altri suggerimenti

[soppresso prima parte dopo il commento]

Sto lavorando con TIFF multi-pagina utilizzando LibTIFF.NET ; Ho trovato molti quicks nella gestione dei TIFF che utilizzano le librerie standard (memoria legati e si blocca anche consistenti, il 16-bit immagini in scala di grigi).

Qual è la vostra immagine di prova? Hai provato un tiff molti fotogrammi (preferibilmente con un grande '1' nel primo fotogramma, un '2 sul prossimo ecc;. Questo potrebbe aiutare a essere certi sul telaio incluso nel file

Un altro diagnosi utile può essere di utilità tiffdump, come incluso nel file binari libtiff (anche per le finestre). Questo vi dirà esattamente che cosa fronti si deve.

Utilizzando libtiff da C # per accedere alle immagini tiff in cotto

[Edit] Se si vuole capire la roba NET: ho trovato una nuova risorsa on TIFF multi-pagina utilizzando le funzionalità standard .NET (anche se ho bastone con libtiff. NET): TheCodeProject: Salvare le immagini in un file TIFF multipagina ... Se si scarica, il frammento di codice nella funzione Form1.cs saveMultipage (..) è simile (ma ancora leggermente diverso) che il vostro codice. In particolare il lavaggio, alla fine è fatto in un modo differente, e il file viene eliminato prima del primo fotogramma ... [/ Modifica]

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