Image na InputStream i w drugą stronę...

Odpowiedz Nowy wątek
JBoss
2009-08-01 17:10
JBoss
0

Witam !!

Zetknąłem się z następującym problemem. Pobieram w metodzie plik typu UploadedFile (który jest obrazkiem). Następnie chcę zrzucić go na InputStream i wrzucić do obiektu typu Image (żeby dokonać pomniejszenia obrazka). Następnie zmieniony obiekt Image chce z powrotem wrzucić do InputStreama i dodać do bazy danych. Korzystam z klasy ImageIO...

public static void loadImage(UploadedFile image, PreparedStatement psmnt,Connection conn) throws SQLException, FileNotFoundException, IOException{
        psmnt = conn.prepareStatement("INSERT INTO public.zdjecie (nazwa,opcje_zdj_id,zdjecie) VALUES (?,?,?)");
        psmnt.setString(1, "fotka");
        psmnt.setInt(2, 1);
        int a = (int)image.getSize();
        Image im ; 
        im = ImageIO.read(image.getInputStream()); // wrzucam inputStream do Imaga
        InputStream is2 = image.getInputStream(); // tak wyciągnięty InputStream z UploadedFile działa prawidłowo
        ImageInputStream is = ImageIO.createImageInputStream(im); // a tak wyciągnięty niestety jest null'em
        psmnt.setBinaryStream(3,(InputStream)is, a);
        int s = psmnt.executeUpdate();
        System.out.println("INSERT OBRAZKA");
        if(s>0) {
          System.out.println("Uploaded successfully !");
           }
        else {
        System.out.println("unsucessfull to upload image.");
          }
        }

Może pomniejszenia obrazka (zmniejszenia rozdzielczości - nie przeskalowania) można dokonać jakoś na InputStreamie - wtedy nie musiałbym się grzebać z Image... Jeśli nie, to może ma ktoś pomysł jak to obejść....

Pozostało 580 znaków

Franco
2009-08-02 09:21
Franco
0

Dołączam się do pytania. Jak w prosty sposób dokonać zmiany rozmiaru pliku jpg zanim zapiszemy go do bazy danych. PreperadStatent w metodzie setBinaryStream oczekuje jako wejścia InputStreama i wielkości pliku jaki chcemy zapisać. Ma ktoś pomysł jak to opanować ??

Pozostało 580 znaków

Franco
2009-08-02 12:57
Franco
0

Rozwiązanie tego problemu jest całkiem proste...Metoda zwraca tablicę w której jest InputStream obrazka i jego długosc....

public static Object[] scaleImage(InputStream p_image, int p_width, int p_height) throws Exception {
     Object t[]= new Object[2];
     InputStream imageStream = new BufferedInputStream(p_image);
     Image image = (Image) ImageIO.read(imageStream); 

     int thumbWidth = p_width;
        int thumbHeight = p_height;        

        // Make sure the aspect ratio is maintained, so the image is not skewed
        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 the scaled image
        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);

        // Write the scaled image to the outputstream
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam param = encoder.
          getDefaultJPEGEncodeParam(thumbImage);
        int quality = 100; // Use between 1 and 100, with 100 being highest quality
        quality = Math.max(0, Math.min(quality, 100));
        param.setQuality((float)quality / 100.0f, false);
        encoder.setJPEGEncodeParam(param);
        encoder.encode(thumbImage);        
        ImageIO.write(thumbImage, "JPG" , out); 
        int b = out.size();
        // Read the outputstream into the inputstream for the return value
        ByteArrayInputStream bis = new ByteArrayInputStream(out.toByteArray());        
        t[0] = bis;
        t[1] = b;
        return t;        
    }

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0