Преобразование Inputstream в BufferedImage повреждает файл - PullRequest
2 голосов
/ 16 ноября 2010

Я загружаю некоторые файлы изображений, используя servelt.Я хочу изменить размеры изображений.Я преобразую источник в BufferedImage, используя строки ниже.

InputStream imageStream = item.getInputStream();

BufferedImage imageBuffer = ImageIO.read(imageStream);

Затем я изменяю размер изображения и пишу в определенном месте.Но размер всех выходных файлов равен 0.

. Я использую следующий код для изменения размера изображения.повредить изображение?Я уверен, что изображение загружается.Но после преобразования в BufferedImage файл поврежден.

Я загружаю, отправив форму в метод doPost ().Следующая строка дает мне InputStream из элемента списка.

InputStream imageStream = item.getInputStream();

И я пишу его как

ImageIO.write(image, "jpg", new File(path + ".jpg"));

Обновление

java.awt.image.ImagingOpException: Unable to transform src image
at java.awt.image.AffineTransformOp.filter(Unknown Source)
at com.pricar.servlet.imageupload.ImageUploadServlet.reSize(ImageUploadServlet.java:100)
at com.pricar.servlet.imageupload.ImageUploadServlet.doPost(ImageUploadServlet.java:74)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Будем благодарны за любые предложения или ссылки !!!

Спасибо!

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Причина, по которой ваш код не работает,

uploadImage = ato.filter(uploadImage, null); //uploadImage == BufferedImage

Ваше конечное изображение пусто.

Вы должны создать новый BufferedImage, чтобы поместить масштабированную версию, как это:

BufferedImage dstImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
ato.filter(uploadImage, dstImage);

Затем сохраните dstImage (используя ImageIO.write).

Edit:

Более простой способ уменьшить изображение - просто нарисовать его в dstImage нужного размера:

int dstWidth = 100;
int dstHeight = 100;
InputStream imageStream = item.getInputStream();
BufferedImage srcImage = ImageIO.read(imageStream);
if (srcImage == null) { System.err.println("NO SOURCE IMAGE!"); }
BufferedImage dstImage = new BufferedImage(dstWidth, dstHeight,
    BufferedImage.TYPE_INT_RGB);
dstImage.getGraphics().drawImage(
    srcImage, 0, 0, dstWidth, dstHeight, null);
ImageIO.write(dstImage, "jpg", new File(path + ".jpg"));
0 голосов
/ 16 ноября 2010

Это может быть просто опечатка в вопросе, но операция фильтра на AffineTransformOp используется неправильно.

Если uploadImage является источником, он также не должен быть пунктом назначения для фильтрации. Фактически, если вы попытаетесь указать uploadImage, так как оба параметра фильтра должны выдать исключение.

Создайте экземпляр BufferedImage, который будет действовать как пункт назначения, и передайте его методу фильтра.

...