Java Thumbnails schwarz Warum?

flou

Mitglied
Hallo,

ich habe ein Bilder-Ftp-Upload Programm geschrieben. Dabei werden aus einem grossen Bild 2 Thumbnails erstellt. Mein Problem ist, dass es häufig vorkommt, dass die Thumbnails dann schwarz sind wenn sie hochgeladen sind. Man muss dazusagen, dass die Bilder ziemlich hohe Auflösungen haben, also mindestens 2-3MB gross sind! Das Wasserzeichen, das ich darüberlege wird jedoch einwandfrei dargestellt. Nur hald auf schwarzem Hintergrund.
Vielleicht weiss jemand woran dies liegen könnte!

Hier (noch nicht ausgereifte) meine Methode:


PHP:
public BWImage createThumbnail(char pType) throws Exception, InterruptedException{
        
        
        // load image from INFILE
        Image image = Toolkit.getDefaultToolkit().getImage(getLocalURL());
        MediaTracker mediaTracker = new MediaTracker(new Container());
        mediaTracker.addImage(image, 0);
        mediaTracker.waitForID(0);
        
        int thumbWidth = image.getWidth(null);
        int thumbHeight = image.getHeight(null);
        
        
        if(pType == 'm'){
            thumbWidth = MINI_WIDTH;
            thumbHeight = MINI_HEIGHT;
        } else {
            thumbWidth = THUMB_WIDTH;
            thumbHeight = THUMB_HEIGHT;
        }
        
        
        
        
        double thumbRatio = (double) thumbWidth / (double) thumbHeight;
        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);
        double imageRatio = (double) imageWidth / (double) imageHeight;
        if (thumbRatio < imageRatio) {
            thumbHeight = (int) (thumbWidth / imageRatio);
        } else {
            thumbWidth = (int) (thumbHeight * imageRatio);
        }
        
        // draw original image to thumbnail image object and
        // scale it to the new size on-the-fly
        BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = thumbImage.createGraphics();
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
        // save thumbnail image to OUTFILE
        File tmpfile = File.createTempFile("bwup",null);
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(tmpfile));
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbImage);
        int quality = 100;
        quality = Math.max(0, Math.min(quality, 100));
        param.setQuality((float) quality / 100.0f, false);
        encoder.setJPEGEncodeParam(param);
        encoder.encode(thumbImage);
        out.close();

        
        // WATERMARKING 
        BufferedImage original = ImageIO.read(tmpfile);

        BufferedImage watermark = ImageIO.read(new URL("http://blablablabla.de/data/img/watermark.png"));
        BufferedImage result = new BufferedImage(original.getWidth(),
                original.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g = result.createGraphics();
        
        
        g.drawImage(original, 0, 0, null);
        //g.drawImage(watermark, 0, 0, null);
        int rpWidth = (int) Math.round(thumbWidth * 0.5);
        int rpHeight = (int) Math.round(thumbHeight * 0.5);
        BufferedImage resizedWm = resizeWatermark(watermark, rpWidth, rpHeight);
        g.drawImage(resizedWm,0,0,resizedWm.getWidth(),resizedWm.getHeight(),null);
        
        out = new BufferedOutputStream(new FileOutputStream(tmpfile));
        encoder = JPEGCodec.createJPEGEncoder(out);
        param = encoder.getDefaultJPEGEncodeParam(result);
        quality = 95;
        quality = Math.max(0, Math.min(quality, 100));
        param.setQuality((float) quality / 100.0f, false);
        encoder.setJPEGEncodeParam(param);
        encoder.encode(result);
        out.close();
                
        BWImage bwtmp = new BWImage(tmpfile.getAbsolutePath());
            
        return bwtmp;
        
    }
 
Zuletzt bearbeitet:
Hi,

ich habe mich da letztens mal flüchtig durchgelesen. Hab das gleiche Problem gehabt wie du, dass das BufferedImage mit schwarzem Hintergrund dargestellt wird und ein normales Image hingegen richtig dargestellt wird.

Wenn ich mich jetzt nicht ganz irre, dann aktiviere vor dem zeichnen mal das composite über graphics2D.setComposite(); Dann sagst ihm, dass er es darüber leben soll. Ich kann dir jetzt nicht genau sagen, wie der Quellcode aussehen muss, da ich es selber nicht ganz im Kopf habe. Aber das kannst auch nachlesen auf der sun webseite.

Gruß
 
Zurück