2010-11-06 3 views
0

J'essaie de traiter les fichiers Canon RAW .CR2 en utilisant C#. Mon code est le suivant:Chargement des fichiers Canon .CR2 dans .NET

BitmapDecoder bmpDec = BitmapDecoder.Create(new Uri(origFile), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None); 
BitmapEncoder bmpEnc = new BmpBitmapEncoder(); 
bmpEnc.Frames.Add(bmpDec.Frames[0]); 
Stream ms = new MemoryStream(); 
bmpEnc.Save(ms); 
Image srcImage = Bitmap.FromStream(ms); 

Les premières lignes semblent fonctionner sans accroc, mais la ligne

bmEnc.Save(ms); 

se planter sans remplir et sans soulever aucune exception.

Est-ce que quelqu'un a eu du succès avec ça?

Répondre

0

Je ne crois pas que BitmapDecoder comprenne .CR2. Ce n'est pas un format d'image conventionnel de loin, car il contient l'image brute du capteur Bayer (une couleur par pixel), et non une image standard.

Si vous voulez convertir CR2 et d'autres formats Camera Raw, vous devriez regarder DCRaw: http://www.cybercom.net/~dcoffin/dcraw/ ou libraw (basé sur dcraw, amical comme une bibliothèque): http://www.libraw.org/

+0

Je ne pense pas que quelqu'un a écrit un wrapper .NET pour libraw? Juste une pensée ... –

+0

OK, encapsuleur .NET maintenant écrit. Si je peux l'obtenir à l'épreuve des balles, je l'afficherai quelque part pour la consommation publique. –

+0

Ou, espérons-le, avant cela? J'aimerais avoir cette enveloppe ... –

4

W8.1 ou W7 après l'application semble https://www.microsoft.com/en-us/download/details.aspx?id=26829 bien travailler

var files = Directory.GetFiles(@"D:\DCIM","*.CR2"); 
      for(var i = 0; i < files.Length; i++) { 
       Console.Write("{0,-4}: {1} => ", i, files[i]); 
       var bmpDec = BitmapDecoder.Create(new Uri(files[i]), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None); 
       var bmpEnc = new JpegBitmapEncoder(); 
       bmpEnc.QualityLevel = 100; 
       bmpEnc.Frames.Add(bmpDec.Frames[0]); 
       var oldfn = Path.GetFileName(files[i]); 
       var newfn = Path.ChangeExtension(oldfn, "JPG"); 
       using(var ms = File.Create(Path.Combine(@"D:\DCIM\100CANON", newfn), 10000000)) { 
        bmpEnc.Save(ms); 
       } 
       Console.WriteLine(newfn); 
      } 
+0

en utilisant (var ms = File.Create (Path.Combine (@ "D: \ DCIM \ 100CANON", newfn), 10000000)). . . . obtenir l'erreur sur le mot "Fichier": 'Controller.File (byte [], string)' est une méthode, qui n'est pas valide dans le contexte donné – JustJohn

+0

Ok, je devais ajouter "System.IO". devant le mot "Fichier" même si l'utilisation de System.IO était déjà en haut de la page. "La raison en est que vous écrivez ce code dans une action du contrôleur qui définit déjà une méthode File sur la classe Controller." http://stackoverflow.com/questions/16188314/why-cant-i-use-system-io-file-methods-in-an-mvc-controller – JustJohn

+0

Ce codec de Microsoft n'est pas mis à jour depuis 2014 ou 2015. Donc, il ne supporte pas les nouvelles caméras. On peut avoir besoin d'installer des codecs individuels de chaque fabricant (par exemple Nikon), ce qui n'est pas idéal –