Ausgabequalität von ImageIO

Status
Nicht offen für weitere Antworten.

waldwichtel

Aktives Mitglied
Hi, ich arbeite gerade an einem Funktionsplotter der die erzeugte Zeichnung auch als Bild exportieren kann. Funktioniert so weit alles sehr gut, nur leider ist die Ausgabequalität unter aller Sau. Will heißen das das Bild total verwaschen und unscharf ist.
Hier mal meine Exportfunktion:

Code:
	public void exportZeichnunginJpeg(){
		//Bild wird erzeugt
		BufferedImage bild = erstellHintergrund(gesamtPanelBreite,
				gesamtPanelHoehe);
		JFileChooser fc = new JFileChooser();
		fc.setMultiSelectionEnabled(false);
		fc.setFileHidingEnabled(true);
		fc.setSelectedFile(new File("Zeichnung.jpeg"));
		int check = JOptionPane.YES_OPTION;
		//Zeichnungen aufmalen
		Graphics2D g = bild.createGraphics();
		g.translate(bild.getWidth() / 2, bild.getHeight() / 2);
		g.setColor(Color.BLACK);
		erstellFunktionsZeichnungen(g);
		do {
			//Speicherdialog
			if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {				
				File temp = fc.getSelectedFile();
				if (temp.exists()) {
					check = JOptionPane.showConfirmDialog(null, "Datei "
							+ temp.getName() + " überschreiben?");
				}
				if (check == JOptionPane.YES_OPTION) {
					try {
						//Bildausgabe
						ImageIO.write(bild, "jpeg", temp);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
			else{
				System.out.println("nix is");
			}
		} while (check != JOptionPane.OK_OPTION);

	}

Ich hoffe ihr könnt mir sagen warum das so ist und wie ich die Qualität des Bilds erhöhen kann. Hab schon ein bischen rumgegoogelt, bin aber zu keinem brauchbaren Ergebniss gekommen.

Gruss Wichtel
 

byte

Top Contributor
Hm, der Code sieht in meinen Augen ok aus. Wie sieht denn die Methode aus, die das BufferedImage liefert? Vielleicht den falschen ImageType angegeben?
 

waldwichtel

Aktives Mitglied
Ich hab den Code gerade nicht da weil ichnicht daheim bin, aber ich verwende beim erstellen des BufferedImages's TYP_INT_RGB.
Ich schreib euch den Code sobald ich wíeder daheim bin
 

byte

Top Contributor
Hm komisch. An der eigentlichen Bildausgabe kanns imo nicht liegen:

Code:
ImageIO.write(bild, "jpeg", temp);

Hatte damit eigentlich nie Probleme. Bist Du sicher, dass das BufferedImage nicht auch schon schlechte Quali hat? Lässt Du das mal irgendwo in der GUI anzeigen?

Code:
erstellFunktionsZeichnungen(g);

Hier wäre interessant zu wissen, was Du nun wirklich zeichnest.
 

waldwichtel

Aktives Mitglied
So, hier jetzt mal der Code

Code:
private BufferedImage erstellHintergrund(int x, int y) {
		BufferedImage hintergrund = new BufferedImage(x, y,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = hintergrund.createGraphics();
		Stroke fein = new BasicStroke(1);
		Stroke dick = new BasicStroke(2f);
		Stroke striche = new BasicStroke(0.5f, BasicStroke.CAP_SQUARE,
				BasicStroke.JOIN_MITER, 2.0f, new float[] { 1.0f, 4.0f }, 0.0f);
		// Hintergrund malen
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, hintergrund.getWidth(), hintergrund.getHeight());
		g.setStroke(dick);
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, hintergrund.getWidth(), hintergrund.getHeight());
		// Nullpunkt auf Mitte setzen
		g.translate(gesamtPanelBreite / 2, gesamtPanelHoehe / 2);
		int i = 0;
		// X-Achsen Unterteilungen
		while (i <= (gesamtPanelBreite / 2) / xMaßeinheit) {
			// Hilfslinien
			if (hilfslinienEnable) {
				g.setStroke(striche);
				g.setColor(Color.LIGHT_GRAY);
				g.drawLine(xMaßeinheit * i, -gesamtPanelHoehe / 2, xMaßeinheit
						* i, gesamtPanelHoehe / 2);
				g.drawLine(-xMaßeinheit * i, -gesamtPanelHoehe / 2,
						-xMaßeinheit * i, gesamtPanelHoehe / 2);
			}
			// Maßlinien
			g.setStroke(fein);
			g.setColor(Color.BLACK);
			g.drawLine(xMaßeinheit * i, -5, xMaßeinheit * i, 5);
			g.drawLine(-xMaßeinheit * i, -5, -xMaßeinheit * i, 5);
			// Beschriftungen
			if (i != 0) {
				if (beschriftungEnable) {
					g.drawString(String.valueOf(i), i * xMaßeinheit - 4, -10);
					g.drawString("-" + String.valueOf(i), -i * xMaßeinheit - 4,
							-10);
				}
			}
			i++;
		}
		// Y-Achsen Unterteilungen
		i = 0;
		while (i <= (gesamtPanelHoehe / 2) / yMaßeinheit) {
			// Hilfslinien
			if (hilfslinienEnable) {
				g.setStroke(striche);
				g.setColor(Color.LIGHT_GRAY);
				g.drawLine(-gesamtPanelBreite / 2, -yMaßeinheit * i,
						0 + gesamtPanelBreite / 2, -yMaßeinheit * i);
				g.drawLine(-gesamtPanelBreite / 2, yMaßeinheit * i,
						0 + gesamtPanelBreite / 2, yMaßeinheit * i);
			}
			// Maßlinien
			g.setStroke(fein);
			g.setColor(Color.black);
			g.drawLine(-5, -yMaßeinheit * i, 5, -yMaßeinheit * i);
			g.drawLine(-5, yMaßeinheit * i, 5, yMaßeinheit * i);
			// Beschriftung
			if (i != 0) {
				if (beschriftungEnable) {
					g.drawString(String.valueOf(i), 0 + 10, 0 - i * yMaßeinheit
							+ 5);
					g.drawString("-" + String.valueOf(i), 0 + 10, 0 + i
							* yMaßeinheit + 5);
				}
			}
			i++;
		}
		g.setStroke(dick);
		// X-Achse
		g.drawLine(0, -gesamtPanelHoehe / 2, 0, gesamtPanelHoehe / 2);
		// Y-Achse
		g.drawLine(-gesamtPanelBreite / 2, 0, gesamtPanelBreite / 2, 0);
		// Endpfeile x-Achse
		g.drawLine(gesamtPanelBreite / 2, 0, gesamtPanelBreite / 2 - 10, +5);
		g.drawLine(gesamtPanelBreite / 2, 0, gesamtPanelBreite / 2 - 10, -5);
		g.drawLine(-gesamtPanelBreite / 2, 0, -gesamtPanelBreite / 2 + 10, +5);
		g.drawLine(-gesamtPanelBreite / 2, 0, -gesamtPanelBreite / 2 + 10, -5);
		// Endpfeile Y-Achse
		g.drawLine(0, -gesamtPanelHoehe / 2, 5, -gesamtPanelHoehe / 2 + 10);
		g.drawLine(0, -gesamtPanelHoehe / 2, -5, -gesamtPanelHoehe / 2 + 10);
		g.drawLine(0, gesamtPanelHoehe / 2, 5, gesamtPanelHoehe / 2 - 10);
		g.drawLine(0, gesamtPanelHoehe / 2, -5, gesamtPanelHoehe / 2 - 10);
		// Endbeschriftungen
		g.drawString("X", gesamtPanelBreite / 2 - 10, -10);
		g.drawString("Y", 10, -gesamtPanelHoehe / 2 + 12);
		this.hintergrundVeraendert = false;
		return hintergrund;
	}

Die YWerte liegen in einem int[][] vor.

Code:
private void erstellFunktionsZeichnungen(Graphics g) {
		for(int i=0;i<yWerte.size();i++){
			g.drawPolyline(xPunkte, yWerte.get(i), gesamtPanelBreite);
		}
	}
 

waldwichtel

Aktives Mitglied
UUUUUUUUUUUUUUUUUUUUUUUUUPs, ok, das Thema hat sich erledigt.

Der Fehler lag in meinem Bildbetrachter, der Sack hat das Bild einfach in der Größe geändert. In nem anderen viewer siehts sauber aus. Sorry!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben