JPEG Auflösung

Status
Nicht offen für weitere Antworten.

The_God

Aktives Mitglied
Habe ein kleines Problem mit der Auflösung von JPEG Bildern. Ganz egal ob ich ein Bild erstelle oder ein Bild lade (300dpI) abgespeichert wird es immer in der Bildschirmauflösung, also mit 72 DPI.
Habs jetzt schon mit AffineTransformation probiert und auch mit der Density beim encoden, aber es funzt einfach nicht.

Das ist in etwa der Code

Code:
    // Image erstellen
    int scalingFactor = 1;
    BufferedImage img = new BufferedImage(340*scalingFactor,340*scalingFactor,BufferedImage.TYPE_INT_RGB);
    Graphics2D g2,g = img.createGraphics();
    g.setColor(Color.BLACK);

    g.setColor(Color.white);
    g.fillRect(3*scalingFactor,3*scalingFactor,334*scalingFactor,334*scalingFactor);

/*  g.fillRect(0,0,1418,1418);
    g.setColor(Color.lightGray);
    g.fillRect(0,0,100,100);
    g.fillRect(1318,1318,100,100);*/


    g.setColor(Color.black);
    Font f1 = new Font("Arial",Font.BOLD,24*scalingFactor);
    g.setFont(f1);
    g.drawString("Arial 24 Bold",10*scalingFactor,50*scalingFactor);
    f1 = new Font("Arial",Font.BOLD,12*scalingFactor);
    g.setFont(f1);
    g.drawString("Arial 12 Bold",10*scalingFactor,100*scalingFactor);
    f1 = new Font("Arial",Font.PLAIN,10*scalingFactor);
    g.setFont(f1);
    g.drawString("Arial 10 Plain",10*scalingFactor,160*scalingFactor);

    g.dispose();//von großen bild


    Graphics2D gsc;
    Image scaled = img.getScaledInstance(340,340,BufferedImage.SCALE_SMOOTH);

    BufferedImage biscaled = new BufferedImage(340,340,BufferedImage.TYPE_INT_RGB);
    gsc = (Graphics2D)biscaled.getGraphics();


    gsc.drawImage(scaled,0,0,this);
    gsc.dispose();

    // JPEG erstellen
    Toolkit tk = Toolkit.getDefaultToolkit();
    float quality = (float)1;

    ByteArrayOutputStream out = new ByteArrayOutputStream (0xfff);

    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

    JPEGEncodeParam param,param1;
    //param1 = null;


    param = encoder.getDefaultJPEGEncodeParam(img);//***

    param.setQuality(quality,true);
    System.out.println("Dens-Unit: "+param.getDensityUnit()+"  x-Dens: "+param.getXDensity()+"  y-Dens: "+param.getYDensity());

    param.setDensityUnit(0);
    param.setXDensity(300);
    param.setYDensity(300);

    param.setHorizontalSubsampling(3,1);
    param.setVerticalSubsampling(3,1);

    try{

      encoder.encode(img, param);

      FileOutputStream fos = new FileOutputStream ("C:\\test.jpg");
      fos.write(out.toByteArray());
      fos.close();
      out.close();

    }catch (Exception e2){

}

Vielleicht kann mir da irgendwer weiterhelfen wäre echt super, denn ein 72 dpI Bild sieht beim Drucken echt mies aus :)
 

dotlens

Top Contributor
wenn du ein neuses BufferedImage erzeugst, kannst du die Grösse des Images im Konstruktor angeben.

API hat gesagt.:
BufferedImage(int width, int height, int imageType)
Constructs a BufferedImage of one of the predefined image types

Beim erzeugen des JPEG kannst du einen Qualitätsfaktor mitgeben.

ich weiss nicht was du mit dpi's möchtest, da das nicht mit dem speichern zu tun hat, sondern nur mit der darstellung danach.
 

The_God

Aktives Mitglied
ja eben, ich möchte das bild danach drucken. Der Drucker nimmt aber bei einer Bildauflösung von 72DPI auch 72 DPI beim drucken.
Also muss es doch irgendwie eine Möglichkeit geben das bild mit einer höheren DPI anzahl abzuspeichern.
Auch wenn ich ein 300 DPI bild lade das ich mit corel erzeugt habe hat es danach trozdem nur mehr 72 DPI :(
 

AlArenal

Top Contributor
Ich sehe den Zusammenhang mit dem Drucken nicht. Wenn der Drucker 300dpi macht, dann ist ein 1:1 gedrucktes Image mit 600x600 Pixeln Größe 2x2 Zoll auf dem Papier groß. Das hat überhaupt nichts mit irgendwelchen Bildschirm-DPIs zu tun...
 

The_God

Aktives Mitglied
ja wenn du ein bild mit 72 DPI auflösung hast und du stellst den drucker auf 300 DPI ein, dann kann er nur mit der maximalqualität des bildes drucken, daher ist es notwendig das bild mit hoher auflösung abzuspeichern, was mir aber leider nicht gelingt
 

AlArenal

Top Contributor
Das ist Schmarrn. DPI-Zahlen in Image-Dateien sind völlig unerheblich. Wenn ich nen Screenshot (1024x768) mache, dann hat das Bild nunmal entsprechende Auflösung und beim Druck mit 300dpi hat es bei 1:1 Druck in etwa 3.x2.x Zoll Größe, ziehe ich es auf A4-Breite auf, wirds entsprechend unschärfer, aber es ändert nichts am Informationsgehalt des Bildes.

Ob ich den Screenshot nun in 72 oder 20000 dpi abspeichere - es enthält nicht mehr oder weniger Pixel / Bildinformationen.

Windows:
Wenn du auf Druck drückst und in Photoshop ein neues Bild anlegst, einmal mit 72 und einmal mit 300 dpi und jeweils die Zwischenablage reinkopierst und das Teil dann als JPG oder sonstwas abspeicherst - es ändert nicht das geringste, wenn du das Bild anschließend öffnest.

Da hatte ich schon herrlichste Diskussionen mit Mediendesignern drüber.. :)
 

The_God

Aktives Mitglied
sicher ändert es was. wenn ich ein 300 DPI bild habe das zb 12x12 cm hat und das mit 300 DPI ausdrucke hat das 12x12cm und eine gute qualität.
habe ich aber nun ein 600 DPI bild und drucke das mit 300 DPI aus ist das bild größer.
Aber wenn ich ein 72 DPI bild habe kann ich das mit maximal 72 DPI ausdrucken, wenn ich es nicht zuvor auf eine höher wertige qualität konvertiere. das kann ich mit corel oder jedem einfachen grafikprogramm machen.
Aber ich habe folgendes prob. ich erzeuge in java ein bild (72DPI) das will ich ausdrucken, was auch nicht das problem ist. aber ich schaffe es nicht das bild auf 300 DPI umzuwandeln damit es eine bessere qualität hat.
 

AlArenal

Top Contributor
Hat nur einen Haken: Eine Bilddatei (ich rede nicht von Firmaten wie CorelDraw oder so, sondern von Images) liegt in Pixeln vor, dpi oder cm Angaben sind da sinnlos. cm errechnen sich dann aus der Auflösung des Bildes über die dpi des Ausgabegeräts.
 

The_God

Aktives Mitglied
Äm, das ist mir schon klar, deswegen hat ein mit java erzeugtes bild 72DPI, die Bildschirmauflösung also. Aber man kann diese Auflösung ändern, und genau das möchte ich machen.
im Windows explorer sieht man die auflösung der bilder, und wenn ich einmal ein 72DPI bild und einmal ein 300 dpi bild im corel erstelle, müssen diesem bild diese attribute zugewiesen werden ansonsten könnte der explorer diese attribute nicht anzeigen oder? :) und ich will eben GENAU DIESE ATTRIBUTE MIT JAVA setzen :):)
 

AlArenal

Top Contributor
Aber das ist sinnlos, weil für Pixel-Bilder diese Angaben unerheblich sind :)

Ein Bild von 1024x768 Pixel ist mit 300 dpi gedruckt immer gleichgroß, egal ob das Ding irgendwo 72 oder 5486 dpi drinstehen hat.
 

The_God

Aktives Mitglied
ja das ist klar denn das bild wenn du es mit einen screenshot erstellst 72 DPI hat, also unter der auflösung des druckers liegt.#


Probiers einfach aus erstell dir ein bild mit 400x400 pixel (300DPI) und eins mit 400 x 400 pixel und 72 DPI, dann siehst den unterschied :(
 

AlArenal

Top Contributor
Nein, du hast mich nicht ganz verstanden. Ich habe nen Screenshot aus der Zwischenablage in zwei neue leere Photoshop-Dateien kopiert, die eine habe ich mit 72 und die andere mit 300 dpi angelegt. Erzeuge ich aus den beiden Dateien JPGs, sind diese identisch, ganz abgesehen davon dass es auch in Photoshop selbst von der Anzeige her nicht interessiert ob ich das Dok vorher mit 72 oder 300dpi erstellt habe.
 

AlArenal

Top Contributor
So.. hab nun daheim nochmal eben mit meinem Laser die Probe aufs Exempel gemacht. Dein Problem sind nicht die DPI-Angaben in den Dateien, sondern die Ansteuerung des Druckers. Je nachdem was du da hast und wie der Treiber voreingestellt ist kommt da X oder Y bei raus. In Irfanview hat man nochmals zig Möglichkeiten den Output zu manipulieren (DPIs aus Datei übernehmen, An siete anpassen (poportional / nicht proportional) und selbst definierte Ausgabeformate).

Das allein ist des Pudels Kern und nicht irgendeine Angabe im Bild, sondern das bekackte Programm mit dem du versuchst deine selbst erstellten Bilder zu drucken. ;)

P.S.:
irfanview ist Freeware und bester Billdbetrachter für Windows wo gibt.
 

The_God

Aktives Mitglied
Hm naja, konnte mich jetzt eh eine zeit nicht damit beschäftigen. aber in java stell ich beim drucker die Auflösung auf 300 DPI und es kommt trotzdem ein richtig bekacktes bild raus :(
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben