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.
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.
Schau dir mal TkPaint an. Gibt es als Sourcecode für Tcl/Tk.
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.
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?
Sonntagsbraten schrieb: > Habe mit Java noch nichts gemacht Ist doch das Perfekte Objekt für einen einstieg, ich poste gleich nochmal ein kleines Beispiel...
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!?).
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 ;)
>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...
Wobei all diese Canvas-Typen die Funktionalität sicher auch anbieten, wenn man etwas selber programmieren will... http://live.gnome.org/ProjectRidley/CanvasOverview
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.