una - system drawing image c#
Lectura de archivos de imagen RAW como GDI+mapas de bits (4)
Descargo de responsabilidad: yo trabajo en Atalasoft.
Nuestro producto DotImage Photo Pro puede hacer esto. Si quiere intentarlo usted mismo, busque envolver el DCRaw de código abierto o mire cómo lo hace Paint.NET (creo que hay un plugin RAW para él)
¿Hay una buena manera de leer archivos de imágenes RAW (especialmente archivos Canon CR2 y Adobe DNG) como mapas de bits GDI + que es razonablemente rápido?
Encontré un ejemplo corriendo bajo WPF que leería una imagen usando cualquier códec de imagen instalado y luego lo mostraría en un control de imagen. Y modifiqué este ejemplo para crear un mapa de bits GDI + escribiendo la imagen WPF en un MemoryStream y creando el Bitmap a partir de eso. ¡Pero este proceso es lento! ¡Horriblemente lento! Abrir una imagen simple toma alrededor de 10 segundos en mi computadora. Esta solución también requiere referencias a los ensamblados WPF y eso no se siente bien, especialmente no porque quisiera ejecutar el código en un proyecto ASP.NET.
Hay programas que realizarán conversiones por lotes de las imágenes, pero preferiría convertir las imágenes dinámicamente cuando se soliciten.
Entonces, ¿alguna sugerencia?
El componente DotImage Photo Pro funcionó bien, pero tuve un problema al extraer la imagen de vista previa de los archivos sin formato que lo usaban. También está fuera de mi presupuesto para este proyecto.
Pero, encontré el código para un plugin RAW para Paint.NET aquí y fue bastante simple de adaptar a mis necesidades. El complemento ejecuta el ejecutable DCRaw con el proceso Process.Start
y lee su salida del flujo StandardOutput
. ¡Muy simple y rápido! :-)
Editar:
El enlace al complemento ya no funciona, pero aquí está el código que usé para extraer las imágenes. El siguiente código extrae la vista previa de jpg almacenada en el archivo sin formato. Si desea la imagen completa, debe eliminar el argumento -e. Pero tenga en cuenta que para algunas cámaras obtendrá una imagen en ppm que GDI + no puede leer.
public Stream GetImageData(string inputFile, string dcRawExe)
{
var startInfo = new ProcessStartInfo(dcRawExe)
{
Arguments = "-c -e /"" + inputFile + "/"",
RedirectStandardOutput = true,
UseShellExecute = false
};
var process = Process.Start(startInfo);
var image = Image.FromStream(process.StandardOutput.BaseStream);
var memoryStream = new MemoryStream();
image.Save(memoryStream, ImageFormat.Png);
return memoryStream;
}
Además, necesitarás una copia de DCRaw. Utilicé el DcrawMS.exe desde este sitio: http://www.insflug.org/raw/Downloads/
Aquí hay un puerto C de dcraw, aunque bastante antiguo (v8.88) que podría adaptarse para incluir modelos de Canon más nuevos:
https://sourceforge.net/projects/dcrawnet/
EDITAR:
Acabo de hacerlo funcionar en mi propio proyecto para leer datos EXIF de archivos RAW:
- Abra las propiedades del proyecto y establezca Output Type to Class Library .
- Recompilar
- Agregue una referencia a la DLL en su propio proyecto.
- Agregar
using dcraw;
en la cima. Declara estas líneas de código:
DcRawState state = new DcRawState(); state.inFilename = filename; state.ifp = new RawStream(filename); Identifier id = new Identifier(state); id.identify(state.ifp);
Ahora echa un vistazo a todas las golosinas dentro del estado (suponiendo que tu archivo RAW es compatible y no causó una excepción;)
Whoa. Acabo de tropezar con esto para mi proyecto .NET MVC. Puede hacer RAW, más cualquier cosa en el mundo que pueda soñar. Incluye código, ejemplos y muchas opciones diferentes de lenguaje de programación. Se ve tan bien que siento ganas de donar algo de dinero incluso antes de usarlo.
Google en "imagemagck" ya que poner un enlace no es recomendable. Incluso hay una entrada de Wikipedia.
Espero que esto ayude a alguien.