2010-01-24 20 views
1

Je suis en train de générer un fichier TIFF multipages à partir d'une image existante en utilisant code by Bob Powell:Génération d'un fichier TIFF multipages ne fonctionne pas

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 il 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 une image particulière d'un fichier TIFF (ajouter des annotations). Je ne sais pas s'il existe une façon plus simple de le faire, mais ce que j'ai en tête est de créer un TIFF multipage à partir de l'image originale et d'ajouter ma propre image au lieu de cette image.

+1

explain « Il ne fonctionne pas » s'il vous plaît. Que se passe-t-il, qu'est-ce qui échoue, quelle erreur (le cas échéant) obtenez-vous? –

+0

Il produit un objet image avec seulement la première image, les autres images ne sont pas ajoutées. – Beatles1692

+1

Votre code a bien fonctionné quand je l'ai essayé. Avez-vous vérifié que l'image source a plusieurs pages? Enregistrez-vous MemoryStream correctement? –

Répondre

0

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); 
} 

se soldent maintenant par comprendra tous les cadres.

+0

Salut, pouvez-vous s'il vous plaît mettre à jour la solution qui a fonctionné pour vous? J'ai essayé ce que tu as suggéré ci-dessus mais je ne travaille pas pour moi. – seUser

+0

Cette solution n'a pas fonctionné pour moi –

1

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

Je travaille avec plusieurs pages TIFFs en utilisant LibTIFF.NET; J'ai trouvé beaucoup de rapides dans le traitement de TIFF en utilisant les bibliothèques standard (liés à la mémoire et aussi des plantages constants sur des images à l'échelle de gris 16 bits).

Quelle est votre image de test? Avez-vous essayé un tiff multi-trame (de préférence avec un grand '1' sur la première image, un '2 sur la prochaine etc, cela pourrait vous aider à être certain sur le cadre inclus dans le fichier.)

le diagnostic peut être l'utilité tiffdump, comme inclus dans les binaires de libTIFF (également pour les fenêtres). Cela vous dira exactement ce cadres que vous avez.

Voir Using LibTiff from c# to access tiled tiff images

[Modifier] Si vous voulez comprendre le .NET stuff: J'ai trouvé une nouvelle ressource sur les tiffs multi-pages en utilisant la fonctionnalité standard .NET (même si je vais rester avec LibTIFF.NET): TheCodeProject : Save images into a multi-page TIFF file... Si vous téléchargez Dans ce cas, l'extrait de code de la fonction Form1.cs saveMultipage (..) est similaire (mais légèrement différent) à 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]

+0

Merci Adriaan.Votre réponse m'a beaucoup aidé car je ne savais pas qu'il y avait une bibliothèque tiff open source là-bas.Je vais l'essayer immédiatement. À propos de la boucle for: J'ai utilisé la première image pour créer l'image elle-même: picture.SelectActiveFrame (FrameDimension.Page, 0); var image = new Bitmap (image); – Beatles1692