Pregunta

C# pregunta (.net 3.5).Tengo una clase, ImageData, que tiene un campo ushort[,] pixels.Estoy tratando con propiedad de formatos de imagen.El ImageData la clase tiene una ubicación para el archivo en el constructor, a continuación, enciende la extensión de archivo para determinar cómo decodificar.En varios de los archivos de imagen, no es un "poco de profundidad de campo" en el encabezado.Después de que me decodificar el encabezado he leído los valores de los píxeles en los "píxeles" de la matriz.Hasta ahora no he tenido más que 16bpp, así que estoy bien.Pero lo que si tengo 32bpp?

Lo que quiero hacer es tener el tipo de píxeles se determina en tiempo de ejecución.Yo quiero hacer esto después de leer la profundidad de bits de la cabecera y antes de que me copie los datos de los píxeles en la memoria.Alguna idea?

¿Fue útil?

Solución

Reducen su problema, usted quiere ser capaz de tener una clase que tiene un ushort[,] pixels campo (de 16 bits por píxel) a veces y un uint32[,] pixels campo (32-bits por píxel) otras veces.Hay un par de maneras diferentes para lograr esto.

Usted podría crear reemplazos para ushort / uint32 haciendo un Píxel de la clase con 32-bit y 16-bit sub-clases, anulando varios operadores hasta el wazoo, pero esto conlleva un montón de sobrecarga, es difícil de conseguir y aún más difícil de determinar si su derecha.Alternativamente, usted puede crear clases de proxy para su los datos de los píxeles (que contendría el ushort[,] o uint32[,] las matrices y tendría todos los descriptores de acceso para ser útil).La desventaja es que es probable que terminan con una gran cantidad de código caso especial en el ImageData de la clase que se ejecuta de una manera u otra dependiendo de algunos de los 16-bit/32-bit indicador de modo.

La mejor solución, creo yo, sería a sub-clase ImageData en 16-bit y 32-bit de clases, y el uso de un método de fábrica para crear instancias.E. g.ImageData es la clase base, ImageData16bpp y ImageData32bpp son sub-clases, método estático ImageData.Crear(cadena imageFilename) es el método de fábrica que crea ImageData16bpp o ImageData32bpp dependiendo de los datos de cabecera.Por ejemplo:

public static ImageData Create(string imageFilename)
{
   // ...
   ImageDataHeader imageHeader = ParseHeader(imageFilename);
   ImageData newImageData;
   if (imageHeader.bpp == 32)
   {
      newImageData = new ImageData32(imageFilename, imageHeader);
   }
   else
   {
      newImageData = new ImageData16(imageFilename, imageHeader);
   }
   // ...
   return newImageData;
}

Otros consejos

Yo diría que no hacer que el trabajo en el construtor - Un constructor no debe hacer mucho trabajo, en mi opinión.El uso de un método de fábrica en la que se lee el archivo para determinar la profundidad de bits, y luego tener que construir la correcta variante genérica de la clase y la devuelva.

Tienen su función decode devolver un objeto de tipo Array, que es la clase base de todas las matrices.A continuación, las personas que se preocupan por el tipo puede hacer ", si es ushort[,])" y si quieren ir a través de los píxeles.Si lo haces de esta manera, usted necesita para asignar la matriz en ImageData, no la otra manera alrededor.

Alternativamente, la persona que llama, probablemente sabe qué tipo de matriz de píxeles ellos quieren que usted utilice.Incluso si se trata de un 8bpp o 16bpp imagen, si eres de decodificación a un 32bpp pantalla, usted necesita usar uint en lugar de ushort.Así que usted podría escribir un ImageData función que va a decodificar en números enteros del tipo que sea, T es.

La raíz de su problema es que usted no sabe cómo decidir qué tipo de formato de salida que desee.Usted necesita a la figura que, en primer lugar, y el programa de sintaxis viene en segundo lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top