# Fehler beim Hochladen: No X11 DISPLAY variable was set, but this program performed an



## P_H_I_L (9. Februar 2010)

Hallo,
ich versuche mit JAVA ein Bild zu rescalen. Ich schneide es auf eine bestimmt höhe/breite zu.... Unter Windows läuft es fehlerfrei. Doch deploye ich das ganze auf meinem linux server (centos) (Webapp--> warfile unter jboss)
kommt diese meldung:
Fehler beim Hochladen: No X11 DISPLAY variable was set, but this program performed an operation which requires it.

Wie kann ich den Fehler beheben.
Ich greife auf den Server nur mittls ssh puty zu. habe keine gui oder ähnliches.

Gibt es packages oder libraries, die man installieren kann um den fehler zu umgehen?

Lg,
Phil


----------



## zerix (11. Februar 2010)

Hallo,

ich weiß nicht ganz wie du es umgesetzt hast. Ich behaupte mal, dass was du nutzt auf den X11-Server zugreifen möchte. Dann kannst du nichts installieren. Ok, du könntest einen X11-Server installieren und starten, das ist aber nicht zweckmäßig. 

Könntest du eventuell mal Source-Code zeigen?

Gruß

Sascha


----------



## Thomas Darimont (11. Februar 2010)

Hallo,

starte deine Anwendung doch mal mit dem JVM Parameter:
-Djava.awt.headless=true 

Siehe auch:
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/

Gruß Tom


----------



## P_H_I_L (11. Februar 2010)

verstehe beide antworten nicht ganz. sorry
bitte um weitere tipps.
also ich hab einen jboss, da ist ein war-file (webapp-projekt) deployed.
das alles läuft unter centOS.

DedicatedServer von mir....

Was muss ich wie starten mit diesem Headless Parameter 
den Jboss? Bitte um Info.

Und wie installiert man x11? Gibts da Packages?

```
public InputStream resizingFunk(InputStream in) {
        ByteArrayInputStream bis = null;
        try {

            BufferedImage source = ImageIO.read(in);
            int iw = source.getWidth(null);
            int ih = source.getHeight(null);
            if (iw > ih) {
                int numOfTests = 10;
                long[] timeArray = new long[numOfTests];
                //test 1-phase Bicubic Java2D-native resize
                for (int sizeIdx = 0; sizeIdx < thumbnail_sizes_w.length; sizeIdx++) {
                    int destWidth = thumbnail_sizes_w[sizeIdx][0];
                    int destHeight = thumbnail_sizes_w[sizeIdx][1];
                    BufferedImage result = null;
                    for (int testNum = 0; testNum < numOfTests; testNum++) {
                        long start = System.nanoTime();
                        result = resizeJava2DNative(source, destWidth, destHeight,
                                RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                        timeArray[testNum] = System.nanoTime() - start;
                    }
                    //sort test results
                    Arrays.sort(timeArray);
                    //calculate average time except the best and the worst results
                    long sum = 0;
                    for (int i = 1; i < numOfTests - 1; i++) {
                        sum += timeArray[i] / 1000000;
                    }
                    //System.out.println("Average time of 1-phase Java2D-BICUBIC - [" + destWidth + "x" + destHeight + "]: " + (sum / (numOfTests - 2)) + "ms");
                    //writeJPEG(result, "C:\\result_java2d_" + destWidth + "_" + destHeight + ".jpg");


                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    ImageIO.write(result, "jpg", out);

                    // Read the outputstream into the inputstream for the return value
                    bis = new ByteArrayInputStream(out.toByteArray());



                }
            } else {
                int numOfTests = 10;
                long[] timeArray = new long[numOfTests];
                //test 1-phase Bicubic Java2D-native resize
                for (int sizeIdx = 0; sizeIdx < thumbnail_sizes_h.length; sizeIdx++) {
                    int destWidth = thumbnail_sizes_h[sizeIdx][0];
                    int destHeight = thumbnail_sizes_h[sizeIdx][1];
                    BufferedImage result = null;
                    for (int testNum = 0; testNum < numOfTests; testNum++) {
                        long start = System.nanoTime();
                        result = resizeJava2DNative(source, destWidth, destHeight,
                                RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                        timeArray[testNum] = System.nanoTime() - start;
                    }
                    //sort test results
                    Arrays.sort(timeArray);
                    //calculate average time except the best and the worst results
                    long sum = 0;
                    for (int i = 1; i < numOfTests - 1; i++) {
                        sum += timeArray[i] / 1000000;
                    }
                    System.out.println("Average time of 1-phase Java2D-BICUBIC - [" + destWidth + "x" + destHeight + "]: " + (sum / (numOfTests - 2)) + "ms");
                    //writeJPEG(result, "C:\\result_java2d_" + destWidth + "_" + destHeight + ".jpg");
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    ImageIO.write(result, "jpg", out);

                    // Read the outputstream into the inputstream for the return value
                    bis = new ByteArrayInputStream(out.toByteArray());
                }
```

Ich denke der Fehler tritt beim ImageIO auf. HAt wohl mas mit graphics zu tun. Kanns am server leider nicht debuggen. Aber laut Inet ist das der Fehler...

Lg,
Phil


----------



## P_H_I_L (11. Februar 2010)

Ich lade in prerender event der Seite diesen code:
System.setProperty("java.awt.headless", "true"); 


hilft auch nix.... :-(


----------



## Thomas Darimont (11. Februar 2010)

Hallo,

du musst -Djava.awt.headless=true auch beim starten der JVM angeben. Also in deinem Fall (JBoss) in run.sh 

Gruß Tom


----------



## zerix (11. Februar 2010)

Thomas Darimont hat gesagt.:


> Hallo,
> 
> starte deine Anwendung doch mal mit dem JVM Parameter:
> -Djava.awt.headless=true
> ...



Das wusste ich gar nicht 

Gruß

Sascha


----------



## P_H_I_L (12. Februar 2010)

habe das gleich ganz oben eingebaut. aber dann kommt file not found...
Sorry das ich mich so blöd stell, aber irgendwie komm ich nicht damit zurecht...

wie genau muss ich die codezeile im *.sh einbinden, damit die JVM mit dem Parameter gestartet wird?

Lg,
Phil


----------



## P_H_I_L (12. Februar 2010)

so habs jetzt den java_ops übergeben.

der Test. Piep Ton erscheint... Super.
Doch beim hochladen bekomme ich null zuück. Muss jetzt mal aufwendige Debug-Meldungen ins logging schreiben lassen... Irgendwas geht noch nicht...

Lg,
Phil


----------



## P_H_I_L (12. Februar 2010)

so konnte durch die debug infos nicht viel rausbekommen.
die x11 meldung ist weg. alerdings tritt noch ein null auf. 

Lokal unter windows auf glassfish gings, kann es sein, dass im jboss/server/default/lib noch was fehlt?
gibt es für das ganze libs:
dieso sind eher untypisch und hab ich noch nicht gebraucht, darum frag ich euch ob ihr wisst wie die jarfiles hierzu heißen. Ober gibts ne möglichkeit diese zu downloaden. Google liefert nichts gutes... :-(


```
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
```

Ich denke für das *java.awt* muss es ein lib geben oder?
und für t j*avax.imageio.*


Für Tipps bin ich sehr dankbar.


----------



## P_H_I_L (12. Februar 2010)

Bekomme es einfach nciht hin :-(

die funktion, die ich geschickt habe ruft wiederum eine funktion auf. und genau an dieser Stelle verabschiedet er sich. 
GraphicsConfiguration gc = getDefaultConfiguration();

Das ist die funktion
	
	
	



```
public static BufferedImage resizeJava2DNative(BufferedImage source, int destWidth, int destHeight,
            Object interpolation) {
        System.out.print("1");
        if (source == null) {
             System.out.print("2");
            throw new NullPointerException("source image is NULL!");
        }
        if (destWidth <= 0 && destHeight <= 0) {
             System.out.print("3");
            throw new IllegalArgumentException("destination width & height are both <=0!");
        }
        int sourceWidth = source.getWidth();
         System.out.print("4");
        int sourceHeight = source.getHeight();
         System.out.print("5");
        double xScale = ((double) destWidth) / (double) sourceWidth;
        double yScale = ((double) destHeight) / (double) sourceHeight;
         System.out.print("6");
        if (destWidth <= 0) {
             System.out.print("7");
            xScale = yScale;
            destWidth = (int) Math.rint(xScale * sourceWidth);
             System.out.print("8");
        }

        if (destHeight <= 0) {
             System.out.print("9:"+yScale);
            yScale = xScale;
            destHeight = (int) Math.rint(yScale * sourceHeight);
             System.out.print("10");
        }
        GraphicsConfiguration gc = getDefaultConfiguration();
         System.out.print("11");
        BufferedImage result = gc.createCompatibleImage(destWidth, destHeight, source.getColorModel().getTransparency());
        Graphics2D g2d = null;
         System.out.print("12");
        try {
            g2d = result.createGraphics();
             System.out.print("13");
            //g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, interpolation);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            AffineTransform at =
                    AffineTransform.getScaleInstance(xScale, yScale);
             System.out.print("14");
            g2d.drawRenderedImage(source, at);
             System.out.print("15");
        } finally {
            if (g2d != null) {
                 System.out.print("16");
                g2d.dispose();
            }
             System.out.print("17");
        }
         System.out.print("18:"+result.toString());
        return result;
    }

    public static GraphicsConfiguration getDefaultConfiguration() {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        return gd.getDefaultConfiguration();
    }
```

Was könnte den noch fehlen?
habe alles wie in der anleitung gemacht... 

Lg,
Phil


----------



## Thomas Darimont (12. Februar 2010)

Hallo,

welche Exception bekommst du denn (Stacktrace)? 

Außerdem könntest du anstatt gc.createCompatibleImage(....) auch einfach new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB); aufrufen.

Dann kannst du dir die problematische Stelle komplett sparen.

Gruß Tom


----------



## P_H_I_L (13. Februar 2010)

danke thomas,
das geht... 

aber das hochgeladene bild wird total dunkel. schaut aus wie ein nachtmodus. kann man da was einstellen, dass das bild so wird wie es beim upload war?!
hab eigentl. nur die eine Methode ausgeauscht wie du beschrieben hast

Lg,
Phil


----------



## bofh1337 (13. Februar 2010)

zerix hat gesagt.:


> Hallo,
> 
> ich weiß nicht ganz wie du es umgesetzt hast. Ich behaupte mal, dass was du nutzt auf den X11-Server zugreifen möchte. Dann kannst du nichts installieren. Ok, du könntest einen X11-Server installieren und starten, das ist aber nicht zweckmäßig.
> 
> ...



Eventuell kann er da doch etwas machen......wenn es sich um einen Linux-Server/Rechner handelt, kann er ein "Screen" angeben, obwohl keine echte Grafische Oberfläche vorhanden/aktiv ist).......ich selber habe das noch nie gebraucht/gemacht.......aber viele Shelscripte laufen auch so


----------

