Avatar billede baitianlong Nybegynder
04. juni 2008 - 11:56 Der er 5 kommentarer og
1 løsning

Resize og vis billede fra BLOB i database

Kan nogen hjaelpe mig med at lave en servlet som kan vise et billede, der kommer fra binaer streng i databasen -og resize billedet inden det vises.

Metoden skal i pseudo-kode goere dette:

doGet() {
  String id = request.getParameter("id");
  byte[] image = getBlobFromDB(id);
  //lav denne blob til et billede
  //lav en resized kopi af det billede
  //set header("image/jpeg")
  //udskriv resized billede;
}

Saadan at jeg kan skrive

<img src="<% printPictureServlet.do?id=45 %>">
Avatar billede baitianlong Nybegynder
04. juni 2008 - 12:29 #1
Jeg har nu faaet lavet servletten, som bare viser billedet.

Er der nogen, der kan hjaelpe med resize delen?

Her er den fungerende servlet:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String refindkey = request.getParameter("id");

        Blob b = DatabaseFunc.getBlob(refindkey);
        try {
            InputStream in = b.getBinaryStream();
            response.setContentType("image/jpeg");
            BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
            byte[] by = new byte[32768];
            int index = in.read( by, 0, 32768 );
            while (index != -1)
            {
                out.write(by, 0, index);
                index = in.read(by, 0, 32768);
            }
            out.flush();
        } catch (SQLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
Avatar billede arne_v Ekspert
05. juni 2008 - 02:06 #3
byte[] by = new byte[32768];
            int index = in.read( by, 0, 32768 );
            while (index != -1)
            {
                out.write(by, 0, index);
                index = in.read(by, 0, 32768);
            }

ville jeg lave som:

            byte[] by = new byte[32768];
            int n;
            while ((n = in.read( by, 0, by.length )) >= 0) {
                out.write(by, 0, n);
            }
Avatar billede baitianlong Nybegynder
05. juni 2008 - 10:52 #4
Jeg har kigget masser af eksempler igennem nu, men der er ikke nogen, der viser det jeg oensker. Hent blob -> lav mindre version -> vis mindre version.

Jeg har proevet i timevis at experimentere med diverse kode stumper fra her og der, men jeg kan ikke faa det til at virke.

Her er mit seneste eksperiment:

public class ShowImageServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String refindkey = request.getParameter("id");

        Blob b = DatabaseFunc.getBlob(refindkey);
        if (b != null) {
            try {
                InputStream in = b.getBinaryStream();

                long len = b.length();
                byte[] data = b.getBytes(1, (int) len);

                Image sourceimage = new ImageIcon(data).getImage();
                int sourcewidth = sourceimage.getWidth(null);
                int sourceheight = sourceimage.getHeight(null);

                int targetwidth = 125;
                int targetheight = sourceheight * (targetwidth / sourcewidth);

                BufferedImage resizedimage = this.scaleImage(sourceimage,targetwidth,targetheight);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(resizedimage);
                byte[] by = out.toByteArray();

                response.setContentType("image/jpeg");
                BufferedOutputStream out2 = new BufferedOutputStream(response.getOutputStream());
                int n = 0;
                while (n < by.length) {
                    out2.write(by[n]);
                }
                out.flush();
            } catch (SQLException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }

    private BufferedImage scaleImage(Image sourceImage, int width, int height) {
        ImageFilter filter = new ReplicateScaleFilter(width, height);
        ImageProducer producer = new FilteredImageSource
                (sourceImage.getSource(), filter);
        Image resizedImage = Toolkit.getDefaultToolkit().createImage(producer);

        return this.toBufferedImage(resizedImage);
    }

    private BufferedImage toBufferedImage(Image image) {
        image = new ImageIcon(image).getImage();
        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null)
                , image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics g = bufferedImage.createGraphics();
        g.setColor(Color.white);
        g.fillRect(0, 0, image.getWidth(null), image.getHeight(null));
        g.drawImage(image, 0, 0, null);
        g.dispose();

        return bufferedImage;
    }


HJAELP!
Avatar billede baitianlong Nybegynder
05. juni 2008 - 12:45 #5
Nu har jeg ogsaa proevet at bruge denne metode, som er skrevet her

http://www.webmaster-talk.com/coding-forum/63227-image-resizing-in-java.html

Og dermed bare manipuleret min inputstream saaledes:

InputStream in = ImageHandler.scaleImage(b.getBinaryStream());

Men nu kommer der ikke noget billede frem :(
Avatar billede baitianlong Nybegynder
05. juni 2008 - 13:13 #6
Nu fik jeg soerme den der sidstnaevnte til at virke... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester