6
votes

DansPlaceballapmemettadatawriter.trysave () retourne vrai mais ne fait rien

sur certains fichiers .jpg (Aperçu des EPS, générés par Adobe Illustrator) dans Windows 7 à Citmapmemettadatawriter.trysave () renvoie true après quelques appels de séquin (), mais ne fait rien.

échantillon de code: P>

BitmapDecoder decoder;
BitmapFrame frame;
BitmapMetadata metadata;
InPlaceBitmapMetadataWriter writer;
decoder = BitmapDecoder.Create(s, BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.Default);
frame = decoder.Frames[0];
metadata = frame.Metadata as BitmapMetadata;
writer = frame.CreateInPlaceBitmapMetadataWriter();
try {
    writer.SetQuery("System.Title", title);
    writer.SetQuery(@"/app1/ifd/{ushort=" + exiftagids[0] + "} ", (title + '\0').ToCharArray());
    writer.SetQuery(@"/app13/irb/8bimiptc/iptc/object name", title);
    return writer.TrySave();
}
catch {
    return false;
}


0 commentaires

3 Réponses :


0
votes

Je n'ai toujours pas trouvé la réponse et je dois écrire un wrapper pour une queue exagérée au lieu d'utiliser le chemin de WPF de travailler avec des métadonnées ... Peut être som1 le trouvera utile.


0 commentaires

4
votes

Deux choses:

  1. Je ne pense pas que vous puissiez écrire à votre métadata ​​code> une variable comme celle-ci, comme il sera gelé. Donc, vous devrez le cloner: p>

    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    if(frame != null && metadata != null) {
        metadata.SetQuery("/app1/ifd/PaddingSchema:Padding", padding);
        encoder.Frames.Add(BitmapFrame.Create(frame, frame.Thumbnail, metadata, frame.ColorContexts));
        using (Stream outputFile = File.Open(_myoutputpath, FileMode.Create, FileAccess.ReadWrite)) {
            encoder.Save(outputFile);
        }
    }
    
  2. rembourrage, vous avez besoin de remplissage. J'ai découvert cela après une journée de bricolage d'une journée à tenter de faire du travail du code (semblable au tien). inplacebamapmetadatawriter code> ne fonctionnera pas s'il n'y a pas de rembourrage de métadonnées dans votre fichier image. strong> Vous avez donc besoin de quelque chose comme: P>

    BitmapMetadata metadata = frame.Metadata.Clone() as BitmapMetadata;
    


1 commentaires

Trysave () retourne vrai ! Mais ne fait rien. Donc, il n'ya aucun moyen de savoir si les métadonnées sont écrites ou non.



3
votes

salut j'ai trouvé Cet article sur surplacebitmapmetadatawriter où le gars a dit que Trysave () pourrait corrompre l'image et c'est pourquoi il a conseillé de faire de Trysave () sur la copie du fichier d'origine et si cela ne fonctionne pas, ajoutez du remplissage à La copie du fichier original et que TRYSAVE () à nouveau () et si elle fonctionne, supprimez l'original et renommez la copie.

J'ai gratté ma tête et me demanda pourquoi je devrais me soucier de la tête dansPlacebitmapmedatawriter et écrire 3x fichier original sur le disque au cas où Trysave () ne fonctionne pas car il n'y a pas assez de rembourrage, si je peux cloner des métadonnées, écrivez-vous tout de suite et assembler le fichier JPEG immédiatement.

Alors j'ai commencé à penser que peut-être que merci de penser à la suite éditer des métadonnées sans perdre de qualité, mais on dirait qu'il "juste" vous aide à écrire des métadonnées plus rapidement s'il y a suffisamment de rembourrage.

J'ai écrit un SMA ll Testez l'endroit où je compresse un fichier à plusieurs reprises pour voir la dégradation de la qualité et vous pouvez le voir dans la troisième compression, ce qui est très mauvais, ce qui est très mauvais.

mais heureusement, si vous utilisez toujours la même qualité avec jpegbitmapencoder n'est pas une dégradation.

Dans cet exemple, je réécrire les mots-clés 100X en métadonnées et la qualité semble ne pas changer. xxx


0 commentaires