Grafiken im metrischen Maß erstellen

jerevat

Mitglied
Hallo,

für eine Android-Anwendung suche ich eine Möglichkeit eine Grafik in metrischen Maßen darzustellen.
Eine zur Laufzeit erstellte Grafik soll z.B. 15 x 8 Zentimer groß werden und in der Auflösung auch ausgedruckt werden können.
Es wäre kein Drama, wenn das Ergebnis um 1-2 Millimeter abweicht.
Kennt jemand entsprechende Bibliotheken, die dies umsetzen können?
Mir scheint, die Canvas-Klasse ist dazu nicht in der Lage.
 
Beste Antwort
Wenn Du von einer Pixelgrafik sprichst, dann hängt das schlicht von der Ausgabe-Auflösung ab.

Beispiel: Ein DIN A4-Blatt ist 29,7 cm hoch und 21 cm breit. D. h. 29.7 / 2.54 Inch breit und 21 / 2.54 Inch hoch. Bei einer Auflösung von 300 dpi ergeben sich 29.7 * 300 / 2.54 Punkte in der Höhe und 21 * 300 / 2.54 Punkte in der Breite.

Das Bitmap für eine DIN A4-Seite muss dementsprechend 3508 x 2481 Pixel groß sein.

Achtung: ein RGB-Bildpunkt kann beim Drucken zu 3 Farbpunkten führen. Wenn bei solchen Druckern von 300 dpi die Rede ist, dann ist damit jeder Farbpunkt gemeint. D. h. ein Farbdruck von 300 dpi ist in dem Fall mit 100 dpi RGB vergleichbar.

Wenn ich es richtig sehe, bietet Canvas eine scale-Methode an. Wenn Dein...

mihe7

Top Contributor
Wenn Du von einer Pixelgrafik sprichst, dann hängt das schlicht von der Ausgabe-Auflösung ab.

Beispiel: Ein DIN A4-Blatt ist 29,7 cm hoch und 21 cm breit. D. h. 29.7 / 2.54 Inch breit und 21 / 2.54 Inch hoch. Bei einer Auflösung von 300 dpi ergeben sich 29.7 * 300 / 2.54 Punkte in der Höhe und 21 * 300 / 2.54 Punkte in der Breite.

Das Bitmap für eine DIN A4-Seite muss dementsprechend 3508 x 2481 Pixel groß sein.

Achtung: ein RGB-Bildpunkt kann beim Drucken zu 3 Farbpunkten führen. Wenn bei solchen Druckern von 300 dpi die Rede ist, dann ist damit jeder Farbpunkt gemeint. D. h. ein Farbdruck von 300 dpi ist in dem Fall mit 100 dpi RGB vergleichbar.

Wenn ich es richtig sehe, bietet Canvas eine scale-Methode an. Wenn Dein Canvas also auf Millimeterbasis arbeiten soll, musst Du nur eine entsprechende Skalierung vornehmen. Der Faktor dürfte bei 300 dpi dann einfach 300/25.4f sein.
 
Beste Antwort

jerevat

Mitglied
Wenn Du von einer Pixelgrafik sprichst, dann hängt das schlicht von der Ausgabe-Auflösung ab.

Wenn ich es richtig sehe, bietet Canvas eine scale-Methode an. Wenn Dein Canvas also auf Millimeterbasis arbeiten soll, musst Du nur eine entsprechende Skalierung vornehmen. Der Faktor dürfte bei 300 dpi dann einfach 300/25.4f sein.
Genau, eine Pixelgrafik die ein Rechteck beschreibt und einen Text im Zentrum beinhaltet.
Skalieren, könnte den Text unleserlich machen. Ich denke, ich werde vorher alles umrechnen und erst dann die Grafik entsprechend erstellen lassen.
Die Hinweise sind dennoch sehr hilfreich. Ich danke dir!

Eins noch: Kann ich bei heutigen handelsüblichen Druckern davon ausgehen, dass sie immer 300 dpi bereitstellen?
 

mihe7

Top Contributor
Skalieren ist kein Problem, da dies vor dem Rendern passiert.

Hier mal der Text mit einem Skalierungsfaktor von 1 (Swing-Anwendung):
1707445370385.png

Und hier mit 8:
1707445435871.png

Nachtrag: hier noch der Code dazu
Java:
class ScaleTest {

    static void updateImage(JLabel label, int zoom) {
        float factor = zoom / 100f;
        int imageSize = (int) Math.ceil(100 * factor);
       
        BufferedImage image = new BufferedImage(imageSize, imageSize,
                BufferedImage.TYPE_INT_ARGB);

        Graphics2D g = image.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g.setColor(Color.BLACK);
        Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
        g.setFont(f);

        g.drawRect(0, 0, imageSize - 1, imageSize - 1);

        String text = String.format("%d %%", zoom);
        LineMetrics metrics = f.getLineMetrics(text, g.getFontRenderContext());        
        System.out.println(metrics.getAscent() + " at " + factor);
        g.scale(factor, factor);         
        g.drawString(text, 5, metrics.getAscent());
        g.dispose();

        label.setIcon(new ImageIcon(image));
    }

    static void createAndShowGUI() {
        JLabel imageLabel = new JLabel();
        imageLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        JSlider slider = new JSlider(50, 1000, 100);
        slider.setMinorTickSpacing(50);
        slider.setMajorTickSpacing(100);
        slider.setSnapToTicks(true);

        Hashtable<Integer, JLabel> labels = new Hashtable<>();
        for (int percent = 100; percent <= 1000; percent += 200) {
            String text = String.format("%d %%", percent);
            labels.put(percent, new JLabel(text));
        }
        slider.setLabelTable(labels);
        slider.setPaintLabels(true);
        slider.addChangeListener(e -> updateImage(imageLabel,
                slider.getValue()));

        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
        buttons.add(slider);

        updateImage(imageLabel, slider.getValue());

        JFrame frame = new JFrame();
        frame.add(buttons, BorderLayout.NORTH);   
        frame.add(new JScrollPane(imageLabel));
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(ScaleTest::createAndShowGUI);
    }
}
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben