2009-05-26 7 views
1

J'utilise C# dans ASP.NET version 2. J'essaie d'ouvrir un fichier image, de lire (et de modifier) ​​l'en-tête XMP et de le refermer. Je ne peux pas mettre à jour ASP, donc WIC est sorti, et je ne peux pas comprendre comment faire fonctionner ça.Modification des données XMP avec C#

Voici ce que j'ai jusqu'à présent:

Bitmap bmp = new Bitmap(Server.MapPath(imageFile)); 

MemoryStream ms = new MemoryStream(); 

StreamReader sr = new StreamReader(Server.MapPath(imageFile)); 

*[stuff with find and replace here]* 

byte[] data = ToByteArray(sr.ReadToEnd()); 

ms = new MemoryStream(data); 

originalImage = System.Drawing.Image.FromStream(ms); 

Toutes les suggestions?

+0

Pour ce que vous essayez d'atteindre, je ne pense pas vraiment besoin de le lire comme Bitmap, vous le son plus comme vous voulez seulement manipuler les octets bruts à droite? – Chris

Répondre

1

Que diriez-vous de ce quelque chose?

byte[] data = File.ReadAllBytes(path); 
... find & replace bit here ... 
File.WriteAllBytes(path, data); 

Aussi, je recommande vraiment contre l'utilisation System.Bitmap dans un processus de asp.net, comme des fuites de mémoire et se bloque/échouent au hasard tous maintenant et encore (même MS admettre cela)

Voici le bit de MS sur les raisons System.Drawing.Bitmap n'est pas stable:

http://msdn.microsoft.com/en-us/library/system.drawing.aspx

« Attention: classes au sein de l'espace de noms System.Drawing sont pas pris en charge pour une utilisation dans un ordinateur Windows ou Service ASP.NET Tenter d'utiliser ces classes à l'intérieur de l'un de ces types d'application peut générer des problèmes inattendus, tels que des performances de service et des exceptions d'exécution réduites. "

0

Vous pouvez utiliser les fonctions suivantes pour lire/écrire les données binaires:

public byte[] GetBinaryData(string path, int bufferSize) 
    { 
     MemoryStream ms = new MemoryStream(); 
     using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read)) 
     { 
      int bytesRead; 
      byte[] buffer = new byte[bufferSize]; 
      while((bytesRead = fs.Read(buffer,0,bufferSize))>0) 
      { 
       ms.Write(buffer,0,bytesRead); 
      } 
     } 
     return(ms.ToArray()); 
    } 

    public void SaveBinaryData(string path, byte[] data, int bufferSize) 
    { 
     using (FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write)) 
     { 
      int totalBytesSaved = 0; 
      while (totalBytesSaved<data.Length) 
      { 
       int remainingBytes = Math.Min(bufferSize, data.Length - totalBytesSaved); 
       fs.Write(data, totalBytesSaved, remainingBytes); 
       totalBytesSaved += remainingBytes; 
      } 
     } 
    } 

Cependant, le chargement des images entières à la mémoire doit utiliser un peu de RAM. Je ne sais pas beaucoup sur les en-têtes XMP, mais si possible, vous devez:

  • charge uniquement les en-têtes dans la mémoire
  • Manipulez les en-têtes dans la mémoire
  • Ecrivez les en-têtes dans un nouveau fichier
  • Copy les données restantes du fichier original
1

Part 1 of the XMP spec 2012, page 10 explique spécifiquement comment modifier un fichier en place sans avoir besoin de comprendre . le format environnant (bien qu'ils suggèrent cela comme un dernier recours) le paquet XMP intégré ressemble à ceci:

<?xpacket begin="■" id="W5M0MpCehiHzreSzNTczkc9d"?> 
    ... the serialized XMP as described above: ... 
    <x:xmpmeta xmlns:x="adobe:ns:meta/"> 
    <rdf:RDF xmlns:rdf= ...> 
     ... 
    </rdf:RDF> 
    </x:xmpmeta> 
    ... XML whitespace as padding ... 
<?xpacket end="w"?> 

Dans cet exemple, « ■ » représente le Unicode « largeur zéro de l'espace insécable caractère "(U + FEFF) utilisé comme marqueur d'ordre d'octets.

Le (XMP Spec 2010, partie 3, Page 12) donne également des modèles d'octets spécifiques (UTF-8, UTF16, grand/petit-boutiste) à rechercher lors de la numérisation des octets. Cela compléterait la réponse de Chris à propos de la lecture du fichier sous la forme d'un flux d'octets géant.

+0

Le lien est cassé. – Dementic

+0

lien fixe ..... – mckamey

Questions connexes