- - PR -
アップロードされた画像の縮小方法
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-16 23:30
Strutsでアップロードされた画像のうち指定サイズより大きい画像は
縮小して取り込む処理を実装するシステムを開発することになりました。 ファイルのアップロードは経験があるのですが、画像を処理する開発は 全く経験が無く、途方に暮れております。 あちこち画像処理のサンプルを見て回って、適当に作ってみたのが以下の ものです。当然、全く機能しません。 どこをどう直す必要があるのか、どなたかご教授いただけませんでしょうか。 処理の都合上、FormFileから元画像を取得し、byte[]として縮小画像を取り 出す必要があります。 private byte[] doResize( FormFile file ) throws IOException { byte[] target = null; double power = 0.5; String format = "jpeg"; BufferedImage original = ImageIO.read(file.getInputStream()); String[] names = original.getPropertyNames(); BufferedImage small = new BufferedImage((int)(original.getWidth()*power), (int)(original.getHeight()*power),original.getType()); AffineTransformOp atOp = new AffineTransformOp( AffineTransform.getScaleInstance(power, power), AffineTransformOp.TYPE_BILINEAR); atOp.filter(original, small); ImageOutputStream stream = ImageIO.createImageOutputStream(target); ImageIO.write( small, format, stream ); return target; } どうか、よろしくお願いいたします。 | ||||||||
|
投稿日時: 2006-03-17 02:31
>全く機能しません
具体的に何がどう機能しないのでしょう? サムネイルの作成方法についてはこれ↓が参考になるでしょうか。 http://yusuke.homeip.net/diary/2006/02/09/1139476974993.html http://yusuke.homeip.net/diary/2006/02/15/1139972587290.html >処理の都合上、FormFileから元画像を取得し、byte[]として縮小画像を取り >出す必要があります。 2ついっぺんにやろうとしないで、まずは縮小画像を作る方法にフォーカスしてみてはいかがでしょう。 | ||||||||
|
投稿日時: 2006-03-17 09:20
インギさん、ご対応ありがとうございます。
デバッグで確認していますと BufferedImage original = ImageIO.read(file.getInputStream()); ↑では、originalがnullになっています。 そして次の String[] names = original.getPropertyNames(); ↑この部分で処理が止まって、画面に以下のエラーが出ていました。 javax.servlet.ServletException: BeanUtils.populate org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495) org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) javax.servlet.http.HttpServlet.service(HttpServlet.java:709) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 原因 java.lang.reflect.InvocationTargetException sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1773) org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759) org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648) org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677) org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022) org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811) org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298) org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493) org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) javax.servlet.http.HttpServlet.service(HttpServlet.java:709) javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
そうですね。教えていただいたサンプルを元に、縮小画像を作ってみます。 | ||||||||
|
投稿日時: 2006-03-17 09:50
>BufferedImage original = ImageIO.read(file.getInputStream());
>↑では、originalがnullになっています。 縮小画像を作る前にまずは画像の読みこみを行う方法をしらべるのが良さそうですね。 >String[] names = original.getPropertyNames(); >↑この部分で処理が止まって、画面に以下のエラーが出ていました。 BeanUtils は関係ないのでは? トラブルシューティングをシンプルにするためにもまずはサーブレットや Struts の Action 内ではなく、スタンドアロンのプログラムで作ってみましょう。 「何が問題となっているのか」「何が出来ていないのか」といった点のフォーカスして一つ一つクリアしていきましょう。 | ||||||||
|
投稿日時: 2006-03-17 10:07
ご親切な対応、感謝いたします。 教えていただいたサンプルを元に早速テストしましたところ、 BufferedImageにInputStreamを設定するときに、bmpファイルだとエラーになるようです。jpegファイルだとエラーに成らずに画像のリサイズに成功しました。 でも、ファイルサイズが大きくて画像を縮小する必要があるのは、たいていユーザが bmpファイルをアップロードしたときなので、bmp形式をなんとか縮小できないのでしょうか。 | ||||||||
|
投稿日時: 2006-03-17 10:52
こんにちは、さくらばです。
Image I/O で BMP をサポートしたのは J2SE 5 からです。 もしお使いのシステムが J2SE 1.4 ベースであるならば、別途 Image I/O Tools をダウンロードしてインストールする必要があります。 ダウンロードは以下のサイトから http://java.sun.com/products/java-media/jai/current.html | ||||||||
|
投稿日時: 2006-03-18 01:04
さくらばさん、インギさん、ありがとうございました。
この機会にJ2SE5にアップして、以下のようなメソッドで、FormFileにアップ ロードされた画像を縮小加工し、byte[]にして返すことができるようになり ました。 でも、運用サーバーのJREは1.4系なので、こちらもJ2SE5系にしないとダメですよね。 もし、以下のメソッドでおかしな点がありましたら、ご指摘お願いします。 private byte[] doResize( FormFile file ) throws IOException { double quality = 0.9; String format = "jpeg"; BufferedImage original = ImageIO.read(file.getInputStream()); String[] names = original.getPropertyNames(); BufferedImage small = new BufferedImage((int)(original.getWidth()*quality), (int)(original.getHeight()*quality),original.getType()); AffineTransformOp atOp = new AffineTransformOp( AffineTransform.getScaleInstance(quality, quality), AffineTransformOp.TYPE_BILINEAR); atOp.filter(original, small); ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageOutputStream stream = ImageIO.createImageOutputStream(os); ImageIO.write( small, format, stream ); byte[] after = os.toByteArray(); os.close(); return after; } |
1