2

servelt を使用していくつかの画像ファイルをアップロードしています。画像のサイズを変更したい。以下の行を使用して、ソースを BufferedImage に変換します。

InputStream imageStream = item.getInputStream();

BufferedImage imageBuffer = ImageIO.read(imageStream);

次に、画像のサイズを変更して場所に書き込みます。ただし、出力ファイルのサイズはすべて0.

次のコードを使用して画像のサイズを変更しています。

AffineTransform at = new AffineTransform();
if(sx != 0)
    at.scale( sx , sx );
AffineTransformOp ato = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
uploadImage = ato.filter(uploadImage, null); //uploadImage == BufferedImage

画像を損傷することなく、inputstream を bufferedImage に変換する良い方法はありますか? 画像がアップロードされていると確信しています。しかし、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)

どんな提案やリンクでも感謝します!!!

ありがとう!

4

2 に答える 2

5

コードが機能しない理由は

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

宛先イメージがnullです。

次のように、スケーリングされたバージョンを配置するために、新しいBufferedImageを作成する必要があります。

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

次に、dstImageを保存します(ImageIO.writeを使用)。

編集:

画像を縮小する簡単な方法は、適切なサイズで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"));
于 2010-11-15T21:39:01.593 に答える
0

これは質問のタイプミスかもしれませんが、AffineTransformOp のフィルター操作が正しく使用されていません。

uploadImage がソースの場合、フィルタリングの宛先にもしないでください。実際、uploadImage を両方のパラメーターとして指定しようとすると、フィルターは例外をスローするはずです。

宛先として機能する BufferedImage インスタンスを作成し、それをフィルター メソッドに渡します。

于 2010-11-15T21:41:02.047 に答える