Estoy usando las clases System.Drawing
para generar miniaturas e imágenes con marcas de agua de fotos cargadas por el usuario. Los usuarios también pueden recortar las imágenes usando jCrop después de cargar el original. Me he apoderado de este código de otra persona, y estoy buscando simplificarlo y optimizarlo (está siendo utilizado en un sitio web con mucho tráfico).Manipulación eficiente de imágenes en C#
El tipo anterior tenía métodos estáticos que recibían un mapa de bits como parámetro y también uno devuelto, asignando y desechando internamente un objeto Graphics
. Según entiendo, una instancia Bitmap
contiene toda la imagen en la memoria, mientras que Graphics
es básicamente una cola de operaciones de dibujo, y es idempotente.
El proceso actualmente funciona de la siguiente manera:
- recibir la imagen y almacenarla en un archivo temporal.
- Recibir coordenadas de recorte.
- Cargue el mapa de bits original en la memoria.
- Crea un nuevo mapa de bits a partir del original, aplicando el recorte.
- Realice un poco de brillo loco ajustando el nuevo mapa de bits, tal vez (?) Devolviendo un nuevo mapa de bits (prefiero no tocar esto; abundan los aritméticos de puntero!), Llamemos a esto A.
- Cree otro mapa de bits desde la que resulta una, la aplicación de la marca de agua (permite llamar a este B1)
- Crear un mapa de bits 175x175 miniatura de A.
- Crear un mapa de bits 45x45 miniatura de A.
esto parece como una gran cantidad de asignaciones de memoria; mi pregunta es esta: ¿es una buena idea reescribir partes del código y reutilizar las instancias Graphics
, creando de hecho una canalización? En efecto, solo necesito 1 imagen en la memoria (la carga original), mientras que el resto se puede escribir directamente en el disco. Todas las imágenes generadas necesitarán las transformaciones de recorte y brillo, y una transformación única que es única para esa versión, creando efectivamente un árbol de operaciones.
¿Algún pensamiento o idea?
Ah, y probablemente debería mencionar que esta es la primera vez que realmente estoy trabajando con .NET, así que si algo que digo parece confuso, por favor tengan paciencia y denme algunas pistas.
Es desafortunado que esta sea su primera interacción con .NET. El patrón IDisposable es mi verdadera frustración duradera con el marco. Este negocio "de uso" es la característica más esotérica que se usa con regularidad; la mayoría de las cosas son muy sencillas. – overslacked
¡Buena pregunta, digo! +1 – Cerebrus
Tuve que buscar 'idempotent' ... buena palabra. – JasonRShaver