- PR -

アップロードされた画像の縮小方法

1
投稿者投稿内容
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 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;
}

どうか、よろしくお願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 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ついっぺんにやろうとしないで、まずは縮小画像を作る方法にフォーカスしてみてはいかがでしょう。
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 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)

引用:

サムネイルの作成方法についてはこれ↓が参考になるでしょうか。
http://yusuke.homeip.net/diary/2006/02/09/1139476974993.html
http://yusuke.homeip.net/diary/2006/02/15/1139972587290.html

>処理の都合上、FormFileから元画像を取得し、byte[]として縮小画像を取り
>出す必要があります。
2ついっぺんにやろうとしないで、まずは縮小画像を作る方法にフォーカスしてみてはいかがでしょう。



そうですね。教えていただいたサンプルを元に、縮小画像を作ってみます。


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-17 09:50
>BufferedImage original = ImageIO.read(file.getInputStream());
>↑では、originalがnullになっています。
縮小画像を作る前にまずは画像の読みこみを行う方法をしらべるのが良さそうですね。

>String[] names = original.getPropertyNames();
>↑この部分で処理が止まって、画面に以下のエラーが出ていました。
BeanUtils は関係ないのでは?
トラブルシューティングをシンプルにするためにもまずはサーブレットや Struts の Action 内ではなく、スタンドアロンのプログラムで作ってみましょう。
「何が問題となっているのか」「何が出来ていないのか」といった点のフォーカスして一つ一つクリアしていきましょう。
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 2006-03-17 10:07
引用:

インギさんの書き込み (2006-03-17 09:50) より:
>BufferedImage original = ImageIO.read(file.getInputStream());
>↑では、originalがnullになっています。
縮小画像を作る前にまずは画像の読みこみを行う方法をしらべるのが良さそうですね。

>String[] names = original.getPropertyNames();
>↑この部分で処理が止まって、画面に以下のエラーが出ていました。
BeanUtils は関係ないのでは?
トラブルシューティングをシンプルにするためにもまずはサーブレットや Struts の Action 内ではなく、スタンドアロンのプログラムで作ってみましょう。
「何が問題となっているのか」「何が出来ていないのか」といった点のフォーカスして一つ一つクリアしていきましょう。


ご親切な対応、感謝いたします。

教えていただいたサンプルを元に早速テストしましたところ、
BufferedImageにInputStreamを設定するときに、bmpファイルだとエラーになるようです。jpegファイルだとエラーに成らずに画像のリサイズに成功しました。

でも、ファイルサイズが大きくて画像を縮小する必要があるのは、たいていユーザが
bmpファイルをアップロードしたときなので、bmp形式をなんとか縮小できないのでしょうか。

さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2006-03-17 10:52
こんにちは、さくらばです。

引用:

トラジャさんの書き込み (2006-03-17 10:07) より:

でも、ファイルサイズが大きくて画像を縮小する必要があるのは、たいていユーザが
bmpファイルをアップロードしたときなので、bmp形式をなんとか縮小できないのでしょうか。



Image I/O で BMP をサポートしたのは J2SE 5 からです。
もしお使いのシステムが J2SE 1.4 ベースであるならば、別途 Image I/O Tools
をダウンロードしてインストールする必要があります。

ダウンロードは以下のサイトから
http://java.sun.com/products/java-media/jai/current.html
トラジャ
ベテラン
会議室デビュー日: 2002/12/05
投稿数: 75
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)