04. juni 2008 - 11:56Der 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; }
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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. } }
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);
Nu fik jeg soerme den der sidstnaevnte til at virke... :)
Synes godt om
Ny brugerNybegynder
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.