Array auf Canvas zeichnen

DerMaaarkus

Grünschnabel
Hallo,

ich habe ein Problem bei meinem Programm.

Und zwar habe ich ein boolean Array in dem ich Berechnungen von geometrischen ausgefüllten Formen mache. Die Formen sind beispielsweise Rechtecke, Dreiecke, Kreise aber auch Kurven von Graphen usw.

Dieses Array ist genauso groß wie meine canvas in der gui -> new array[canvas.getWidth()][canvas.getHeight()].

Das Problem ist ich will das Array halt schwarz/weiß (von daher könnte das Array auch ein byte oder int Array sein) auf die Canvas zeichnen. Ich möchte aber nicht durch das gesamte Array iterieren, da dies bei einem z.B. 1000*768 großen Array eine ziemlich schlechte laufzeit hätte. Oder wie seht ihr das?

Kennt jemand eine Möglichkeit wie ich so ein Array sonst auf die Canvas zeichnen kann? :)



Danke schoneinmal für Antworten,
Markus
 
Ich weiß zwar nicht, was die anderen so sagen werden, aber ich würde vorschlagen, dass du das ganze ein wenig komprimierst. Eine wohl sehr einfache Möglichkeit wäre z.B. sowas:
Code:
2b30w100b2w
b und w stehen halt für black und white und die Zahl davor eben für die Anzahl der Pixel in der Farbe. Wie du das auf deine Sache überträgst, ist dir überlassen, kannst wieder ein zweidimmensionales Array anlegen, kannst aber auch nur ein Array für die Zeilen und den komprimierten Kram als String eintragen, musst dann dannach eben zusehn, wie du die Bestandteile wieder auseinander bekommst.

Was vielleicht auch etwas zur Geschwindigkeit beitragen würde, wäre zu wissen, welche der beiden Farben den größten Anteil hat. Sprich wenn z.B. schwarz etwa 70% der Fläche einnimmt, dann kann man das ganze Canvas einfach in schwarz einfärben und dann mit weiß nur die paar Stellen übermalen lassen.
 
danke, das klingt schonmal nicht schlecht :) aber ich ich muss mal gucken wie genau ich das umsetzen könnte...

Gibt es denn nicht vielleicht eine Möglichkeit ein Bild aus dem Array zu erstellen und das einfach zu zeichnen, oder sowas in der Art?
 
Sicher kannst du ein Bild aus den Bytes zusammenbauen und dann zeichnen lassen. Such dir ein Format aus und baue es nach. Ob es dann klappt, ist natürlich eine andere Sache. Ich habe mal versucht mir ein Bild durch Bytes zusammen zu bauen, halt im PNG-Format, leider lief das nicht so ganz, wie ich das wollte. Ich weiß auch gar nicht mehr warum ich das gemacht habe, aus irgendeinem Grund wollte ich ein Bild on-the-fly generieren und PNG hab ich einfach genommen, weil es super Quali hat und die durchsichtige Farbe unterstützt, was z.B. bei JPG ein bisschen anders ist, vor allem was die Qualität angeht. Vielleicht habe ich den Datei-Header auch falsch zusammengesetzt, weiß ich nicht. Die Datei-Header kann man ja nachgooglen. Die Frage ist natürlich, ob es sich überhaupt lohnt. Aber kannst es ja probieren. Vielleicht gibt es auch Libs, die nur die "Nutz-Bytes" haben wollen und man selber gar nicht mehr das Format nachbauen muss.
 
Hier mal eine Möglichkeit das ganz per 2D Array durchzuführen:

AWT
Code:
public Image getImageFromArray(int[] pixels, int width, int height) {
    MemoryImageSource mis = new MemoryImageSource(width, height, pixels, 0, width);
    Toolkit tk = Toolkit.getDefaultToolkit();
    return tk.createImage(mis);
}

ImageIO:
Code:
public static Image getImageFromArray(int[] pixels, int width, int height) {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    WritableRaster raster = (WritableRaster) image.getData();
    raster.setPixels(0,0,width,height,pixels);
    return image;
}

Die beiden Methoden sollten eigentlich beide funktionieren und beide auch das selbe Ergebnis liefern.
Den PixelArray bekommt man z.B. über den PixelGrabber wenn man ein Bild in einen Array einliest, da du aber nur 2 Farben hast kannst die int-Werte für die beiden Pixel auch irgendwo als konstante hinterlegen um statt true/false dann diese Werte in den Array einzutragen.
 
Zurück