Frage

C # Frage (.net 3.5). Ich habe eine Klasse, Imagedata, die ein Feld ushort hat [,] Pixel. Ich beschäftige mich mit proprietären Bildformaten. Die Imagedata Klasse nimmt einen Speicherort im Konstruktor, dann schaltet auf Dateierweiterung, um zu bestimmen, wie zu entschlüsseln. In mehreren der Bilddateien, gibt es eine „Bit-Tiefe“ Feld in der Kopfzeile. Nachdem ich den Header zu dekodieren lesen I die Pixelwerte in die „Pixel“ -Anordnung. Bisher habe ich nicht mehr als 16 bpp hatte, also bin ich in Ordnung. Aber was, wenn ich 32bpp?

Was ich will, ist, tun die Art von Pixeln zur Laufzeit bestimmt werden. Ich möchte, dies zu tun, nachdem ich die Bittiefe aus dem Header gelesen und bevor ich die Pixeldaten in den Speicher kopieren. Irgendwelche Ideen?

War es hilfreich?

Lösung

Ihr Problem einkochen, Sie wollen eine Klasse haben, in der Lage sein, die ein ushort hat [,] Pixel Feld (16 Bit pro Pixel) manchmal und ein uint32 [, ] Pixel Feld (32 Bits pro Pixel) einige andere Zeiten. Es gibt ein paar verschiedene Möglichkeiten, dies zu erreichen.

Sie könnten Ersatz für ushort / uint32 erstellen, indem ein Pixel-Klasse mit 32-Bit und 16-Bit-Unterklassen zu machen, zwingende verschiedene Operatoren die wazoo, aber dies viel Aufwand verursacht, ist heikel Recht und sogar zu erhalten heikler, wenn ihr Recht zu bestimmen. Alternativ können Sie Proxy-Klassen für Ihre Pixeldaten erstellen (die die ushort enthalten würde [,] oder uint32 [,] Arrays und würden alle notwendigen Zugriffs müssen nützlich sein). Der Nachteil ist, dass Sie wahrscheinlich mit viel Sonderfall Code in der Klasse Imagedata enden würde, die in Abhängigkeit von einem gewissen Modus-Flag 16-Bit / 32-Bit eine oder andere Weise ausgeführt werden.

Die bessere Lösung, glaube ich, zu Unterklasse Imagedata in 16-Bit- und 32-Bit-Klassen, und verwenden Sie eine Factory-Methode würde Instanzen zu erstellen. Z.B. Imagedata ist die Basisklasse, ImageData16bpp und ImageData32bpp sind Subklassen, statische Methode ImageData.Create (string imagefilename) ist die Herstellungsmethode, die entweder ImageData16bpp ImageData32bpp oder in Abhängigkeit von den Header-Daten erstellt. Zum Beispiel:

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;
}

Andere Tipps

würde ich sagen, nicht, dass die Arbeit in der construtor zu tun - Ein Konstruktor sollte nicht so viel Arbeit tun, meiner Meinung nach. Verwenden Sie eine Factory-Methode, die die Datei liest die Bit-Tiefe, um zu bestimmen, dann haben sie die richtige generische Variante der Klasse konstruieren und es zurück.

Haben Sie Ihre Dekodierungsfunktion ein Objekt vom Typ Array zurückgeben, die die Basisklasse aller Arrays ist. Dann werden die Menschen, die über die Art kümmern kann tun „wenn (a ushort ist [,])“ und so weiter, wenn sie durch die Pixel gehen wollen. Wenn Sie es auf diese Art und Weise zu tun, müssen Sie das Array in Imagedata zuzuteilen, nicht umgekehrt.

Alternativ weiß der Anrufer wahrscheinlich, welche Art von Pixel-Array sie Sie verwenden möchten. Auch wenn es ein 8bpp oder 16bpp Bild ist, wenn Sie es zu einem 32bpp Bildschirm sind Decodierung, müssen Sie uint statt ushort verwenden. So können Sie eine Imagedata Funktion schreiben, die in ganzen Zahlen, wie auch immer geartet T dekodieren.

Die Wurzel des Problems ist, dass Sie nicht wissen, wie zu entscheiden, welche Art von Ausgabeformat Sie wollen. Sie müssen das erste und das Programm Syntax zweite kommt, um herauszufinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top