Question

Je suis en train de générer un fichier TIFF multipages à partir d'une image existante en utilisant le code par 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();
}

Mais cela ne fonctionne pas (seule la première image est inclus dans l'image) et je ne sais pas pourquoi.

Ce que je veux faire est de changer un cadre particulier d'un fichier TIFF (y ajouter des annotations).

Je ne sais pas s'il y a une façon plus simple de le faire, mais ce que j'ai à l'esprit est de créer un fichier TIFF multipages de l'image originale et ajouter ma propre image au lieu de ce cadre.

Était-ce utile?

La solution 2

Il semble que ce processus ne change pas l'objet d'image, mais il change le cours d'eau, donc je devrais obtenir le tampon de flux de mémoire et construire un autre objet image:

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

Résultat maintenant comprendra toutes les images.

Autres conseils

[première partie supprimée après commentaire]

Je travaille avec plusieurs pages TIFFs en utilisant LibTIFF.NET ; J'ai trouvé beaucoup Quicks dans le traitement des TIFF en utilisant les bibliothèques standard (mémoire et doivent également plantages constants sur les images d'échelle de gris 16 bits).

Quelle est votre image test? Avez-vous essayé un fichier TIFF beaucoup-cadre (de préférence avec un grand « 1 » sur la première image, un « 2 sur le prochain etc;. Cela pourrait vous aider à être certain sur le cadre inclus dans le fichier

Un autre diagnostic utile peut être l'utilité tiffdump, comme inclus dans les binaires LibTIFF (également pour les fenêtres). Cela vous dire exactement ce que vous avez cadres.

Voir En utilisant LibTIFF de c # pour accéder aux images TIFF carrelés

[Modifier] Si vous voulez comprendre les choses .NET: J'ai trouvé une nouvelle ressource sur tiff de plusieurs pages à l'aide de la fonctionnalité .NET standard (bien que je vais rester avec LibTIFF. NET): TheCodeProject: Enregistrer des images dans un fichier TIFF de plusieurs pages ... Si vous le téléchargez, l'extrait de code dans la fonction Form1.cs saveMultipage (..) est similaire (mais toujours légèrement différent) que votre code. En particulier, le rinçage à la fin se fait d'une manière differnt, et le fichier est supprimé avant la première image ... [/ Modifier]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top