Forum: PC-Programmierung S: Einfaches Malprogramm mit Quellcode


von Sonntagsbraten (Gast)


Lesenswert?

Ich suche z.B. ein Beispielprogramm für ein Grafik oder GUI Toolkit, 
dass z.B. Pixel und Linien malen kann, die jedoch als Objekte noch 
manipulierbar sind (Auswahl durch anklicken oder über eine Liste, 
Manipulation: Löschen, Verschieben, Farbe).
Es soll kein Anti-Aliasing durchführen.
Es sollte möglich sein, das Bild in Objektform und als Rastergrafik zu 
speichern.
Es wäre gut, wenn Linien beim Erstellen live gezeichnet werden. Also 
"Klick" und dann als Gummiband das Linienobjekt bei jeder Mausbewegung 
neuzeichnen.
Zoom ist eigentlich auch wichtig.

Vielleicht kennt ja jemand eine Programmierübung für so ein "einfaches" 
Malprogramm.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Mit der Java2D API kann man so etwas recht simpel umsetzen, du hältst 
dir in deiner Komponente einfach eine Liste von Shapes ( 
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Shape.html ) 
welche du manipulieren kannst, nach jeder Manipulation wird ein repaint 
ausgeführt, Antialiasing gibt's gratis geschenkt dazu, Speichern in 
gängige Grafikformate inclusive, Persistenz als Vektorgrafik entweder 
über Objectstream, XStream oder gleich als SVG...

Die Frage ist also eher was du mit do einem "Malprogramm" anstellen 
willst. Inkscape ist z.B. schon etwas "fertiges" welches all deine 
Anforderungen erfüllen sollte.

von DirkB (Gast)


Lesenswert?

Schau dir mal TkPaint an.
Gibt es als Sourcecode für Tcl/Tk.

von Sonntagsbraten (Gast)


Lesenswert?

Ich möchte Pixelgrafiken erstellen, aber nicht alles manuell mit einem 
1-Pixel-Stift machen müssen.
Daher ist es wichtig, dass kein Anti-Aliasing durchgeführt wird.

Macromedia Fireworks (jetzt Adobe) ist eine Mischung aus Raster- und 
Vektorgrafikprogramm und wäre ideal, ist aber eingestellt worden und 
eine Heft-Version habe ich noch nicht gefunden. Die letzte Demo läuft 
bei mir leider auch nicht.

http://mars.netanya.ac.il/~samy/tkpaint.html läuft mit
http://www.activestate.com/activetcl/downloads

Zeichnet leider die Linien neu anstatt stumpf zu zoomen.


http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics2D.html
Anti-Aliasing kann abgeschaltet werden.

Fehlt nur noch das Programm :-)
Habe mit Java noch nichts gemacht, aber ich suche in die Richtung mal 
weiter.

von Rolf Magnus (Gast)


Lesenswert?

Sonntagsbraten schrieb:
> Ich möchte Pixelgrafiken erstellen, aber nicht alles manuell mit einem
> 1-Pixel-Stift machen müssen.
> Daher ist es wichtig, dass kein Anti-Aliasing durchgeführt wird.

Der Zusammenhang erschließt sich mir nicht.

Sonntagsbraten schrieb:
> http://mars.netanya.ac.il/~samy/tkpaint.html läuft mit
> http://www.activestate.com/activetcl/downloads
>
> Zeichnet leider die Linien neu anstatt stumpf zu zoomen.

Verstehe ich dich richtig: Du willst ein Programm, wo man zwar wie in 
einem Vektorgrafikprogramm zeichnen kann, wo das Zoomen aber wie bei 
einem Pixelgrafikprogramm aussieht? Oder was verstehst du unter "stumpf 
zu zoomen"?
Und Antialiasing darf es auch nicht machen? Was ist Sinn dieser Übung?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Sonntagsbraten schrieb:
> Habe mit Java noch nichts gemacht

Ist doch das Perfekte Objekt für einen einstieg, ich poste gleich 
nochmal ein kleines Beispiel...

von Sonntagsbraten (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Was ist Sinn dieser Übung?

Ich mag es minimalistisch :-) Leider kann man bei Inkscape das 
Antialiasing nicht abschalten.

Sowas hat aber auch als Kunst/Designform "Pixelart" Anhänger: z.B. 
http://hello.eboy.com/eboy/ Es ist wohl auch als 'retro' anzusehen.


Uh, ich sehe gerade dass mspaint in Windows 7 fast genau das macht, was 
ich möchte! Es ist aber nur immer das aktuelle Objekt veränderbar, 
sobald man ein anderes Werkzeug benutzt, wird es ins Bitmap gespeichert.

Läubi .. schrieb:
> Ist doch das Perfekte Objekt für einen einstieg, ich poste gleich
> nochmal ein kleines Beispiel...

Das wär' zwar sehr nett, und ich werde es mir auf jeden Fall ansehen, 
aber mach dir meinetwegen bitte keine Mühe (schönes Wetter!?).

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

So in etwa würde die Kern Zeichenfunktion aussehen:
1
private final List<PaintObject> paintObjects = new ArrayList<SimplePaint.PaintObject>();
2
 private PaintObject             previewObject;
3
4
 /**
5
  * Zeichnet den Aktuellen Zustand auf das angegeben Grafikobjekt
6
  * 
7
  * @param g
8
  * @param dimension
9
  */
10
 public void drawCanvas(Graphics2D g, Dimension dimension) {
11
     //Anti alias off
12
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
13
          RenderingHints.VALUE_ANTIALIAS_OFF);
14
     g.scale(zoom, zoom);
15
     synchronized (paintObjects) {
16
         for (PaintObject object : paintObjects) {
17
             paintShape(g, object);
18
         }
19
     }
20
     if (previewObject != null) {
21
         paintShape(g, previewObject);
22
     }
23
 }
24
25
 protected void paintShape(Graphics2D g, PaintObject object) {
26
     g.setColor(object.getColor());
27
     g.draw(object.getShape());
28
 }
29
30
 public static class PaintObject {
31
     public PaintObject(Shape shape, Color color) {
32
         this.shape = shape;
33
         this.color = color;
34
     }
35
36
     private Shape shape;
37
     private Color color;
38
39
     public void setShape(Shape shape) {
40
         this.shape = shape;
41
     }
42
43
     public Shape getShape() {
44
         return shape;
45
     }
46
47
     public void setColor(Color color) {
48
         this.color = color;
49
     }
50
51
     public Color getColor() {
52
         return color;
53
     }
54
}
Im Anhang mal das vollständige Beispiel, es wird nur Farbauswahl und 
Linien zeichnen Unterstützt, eine Editierfunktion ist nicht enthalten 
ebenso keine Verschieden Strichstärken und Arten, bitte nicht als 
Beispiel für guten Stil nehmen, ist nur schnell zusammen getöpselt und 
alles in einer Datei abgelegt aber das Prinzip sollte klar sein.

Als Bild kann man das ganze z.B. so ablegen:
1
BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
2
paint.drawCanvas(image.createGraphics(), new Dimension(800, 600));
3
ImageIO.write(image, "png", new File("test.png"));

Der Rest verbleibt dann dem geneigtem Leser als Übung ;)

von Stefan Salewski (Gast)


Lesenswert?

>Der Zusammenhang erschließt sich mir nicht.

Mir auch nicht, ich habe diesen Beitrag auch nur versehentlich 
angeklickt.

Pixelart: Kombination aus Inkscape und Gimp wäre möglich:

http://www.inkscapeforum.com/viewtopic.php?f=22&t=8530

Für Inkscape sollte man das Anti-Alias auch abschalten können, es wird 
ja Cairo verwendet, und da kann man es abschalten. Eventuell müsste man 
InkScape patchen (lassen).

Das alte XFIG könnte man auch nehmen...

von Stefan Salewski (Gast)


Lesenswert?

Wobei all diese Canvas-Typen die Funktionalität sicher auch anbieten, 
wenn man etwas selber programmieren will...

http://live.gnome.org/ProjectRidley/CanvasOverview

von Montagsbraten (Gast)


Angehängte Dateien:

Lesenswert?

JDK von hier: 
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Netbeans IDE (auch mit SDK) von hier:
http://netbeans.org/downloads/index.html

Das Projekt bzw. die .java Datei muss heissen wie die Klasse 
(SimplePaint).


Zoom und Anti-Aliasing machen aber keinen Unterschied (glatter Zoom und 
ich sehe keinen Unterschied mit/ohne AA).

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Montagsbraten schrieb:
> ich sehe keinen Unterschied mit/ohne AA
Es gibt noch sehr viel mehr "Hints" die man setzen kann, AA ist bei 
einer Komponenten mein ich auch Standardmäßig aus:
http://download.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html

Zudem kann es sein, da ich den Zoom direkt im Graphics Objekt setze, das 
die Auswirkungen nicht direkt sichtbar sind, ggf. mal Grafikprogramm 
bemühen.

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

Folgender Code:
1
public class AATest {
2
  public static void main(String[] args) throws IOException {
3
    BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
4
    Graphics2D graphics = (Graphics2D) image.getGraphics();
5
    graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
6
    graphics.setColor(Color.WHITE);
7
    graphics.fillRect(0, 0, 200, 200);
8
    graphics.setColor(Color.BLUE);
9
    graphics.draw(new Line2D.Double(0, 0, 200, 200));
10
    graphics.setColor(Color.RED);
11
    graphics.draw(new Line2D.Double(0, 200, 200, 0));
12
    ImageIO.write(image, "png", new File("img3.png"));
13
  }
14
}
Einmal mit und einmal ohne AA-Hint in 6-facher Vergrößerung

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.