大きな画像を加工したい

506 views
Skip to first unread message

hacha

unread,
Dec 21, 2012, 12:19:04 AM12/21/12
to android-g...@googlegroups.com
現在、画像を加工するアプリを作成していますが、大きな画像の扱いで困っています

大きな画像を読み込むとすぐにメモリ不足になるため、普通はBitmapFactory.OptionsのinSampleSizeでリサンプリングしたものを読み込むかと思います
しかし、当然ながらこれでは画像が劣化してしまいますし、画像の縦横サイズも原寸にはなりません

可能な限り劣化を抑えたいと思い調べたところ、BitmapRegionDecoder.decodeRegionというのを見つけました
これで巨大画像から一部分だけを劣化させず読み込むのはできそうなんですが、加工後の画像を書き戻す方法が見つかりません
元画像をdecodeRegionで升目状に分割して、分割したものを個別に書き出すならBimap.compressで可能です
しかしこの方法でも、バラバラになった複数ファイルを一つの画像ファイルに連結する方法が分かりません

decodeRegionで抜き出した画像を、元画像に書き戻す方法
または
複数画像ファイルを連結して一つの画像ファイルにする方法
というのは無いでしょうか?

やりたい事は、
・巨大な画像を
・(可能な限り)劣化させず
・最低限、縦横のサイズは変化させず
・加工して書き出す
なので、他にやり方・アイデアがあれば何でもかまいません
アドバイスを頂けると幸いです

はちゃ

unread,
Dec 26, 2012, 5:40:39 AM12/26/12
to android-g...@googlegroups.com
>「巨大な画像」の具体的なサイズ

想定ではユーザーが撮影した写真等の任意の画像ファイルです
ユーザーが用意する画像なので、特にサイズの指定はできません
この場では、BitmapFactory.decodeFile()でそのまま読み込むと一発でOutOfMemoryErrorになるサイズ、と思って下さい

>加工の種類(フィルタ?トリム?・・・)

どちらかと言えばフィルタ系となりますが、ソース画像にスタンプのように画像を合成するような事もやろうとしています



2012年12月26日 13:14 shohei komukai <puny...@gmail.com>:
教えていただけますか?
・「巨大な画像」の具体的なサイズ
・加工の種類(フィルタ?トリム?・・・)

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/CJ-zyiOySzwJ にアクセスしてください。

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

田代透

unread,
Dec 26, 2012, 4:11:34 PM12/26/12
to android-g...@googlegroups.com
libjpegなどを使えばパイプライン処理が可能だと思いますけど、難易度はかなり高くなるかと思います。


2012年12月26日 19:40 はちゃ <hach...@gmail.com>:



--
--
Toru Tashiro
toru...@gmail.com

はちゃ

unread,
Dec 26, 2012, 8:45:09 PM12/26/12
to android-g...@googlegroups.com
最終的には、画像フォーマットの仕様を調べてバイナリを操作する方向で考えていました
ただ現状、NDKでの開発はおろかC系統の言語知識も乏しく、機能の実現までに基礎知識の勉強から始めねばならず時間がかかりそうな状態です
そこで、複数画像を結合するくらいのライブラリなら既にありそうかなと思い、質問してみた次第です

当面は地道に勉強する事にします



2012年12月27日 6:11 田代透 <toru...@gmail.com>:

TH

unread,
Dec 27, 2012, 12:09:51 AM12/27/12
to android-g...@googlegroups.com
アーカイブの下記の記事は参照されましたか?

画像をきれいに縮小する方法
https://groups.google.com/forum/?fromgroups=#!topic/android-group-japan/BeAELm0Yd_U

あとはGAEへ一旦送って縮小させて戻す
なんて方法もあります。

Androidで画像縮小する方法いろいろ
http://fight-tsk.blogspot.jp/2011/01/android.html


ご参考迄

2012年12月27日 10:45 はちゃ <hach...@gmail.com>:

Hiroaki GOTO as GORRY

unread,
Dec 27, 2012, 1:17:21 AM12/27/12
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

今回は「オリジナルサイズのままの加工」が目的のようなので、
縮小はできないかと思います。

おそらくはNDK上で組むのが最も適切ですが、もうひとつの手段として
「Android3.0以上を対象にする」という方法があります。
OS3.0以降はBitmapの実体格納メモリがネイティブ部になったため
より大きい画像を保持できるようになっていることによるものです。

大雑把に、一般的なデジカメで生成できる4000x3000pxくらいの画像を
ベタに展開するだけでも40~50MBくらいのメモリを必要とし、
さらに加工するとなるとその2~3倍のメモリが必要となります。

「そのくらいのメモリを用意しやすい端末」という時点で、たとえ
NDK上で組んだとしてもOS2.3では適さない端末が結構あるのでは
ないかと考えます。


In message <CAFYSpDbXMa2H0arQwS3uL392wSKTVT4cCbV-rGkf=apAv...@mail.gmail.com>
"Re: [android-group-japan: 21427] Re: 大きな画像を加工したい"
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

はちゃ

unread,
Dec 27, 2012, 4:39:07 AM12/27/12
to android-g...@googlegroups.com
>THさん

GORRYさんの仰る通り、今回は縮小出来ない(したくない)案件なのです
ただ、参考URLを見ていてWebViewで表示する手法が気になりました
少し試した所、BitmapFactory.decodeFile()でメモリオーバーとなる画像でも、WebView上のcanvasに読み込んで表示する事が可能でした
まだ試行錯誤中ですが、canvas.toDataURL()で取得した内容を保存できればどうにかできるかもしれません
エフェクト処理部をJavaScriptで書き直したり、処理速度的な問題も出てくるでしょうけど……

> GORRYさん

もともとタブレット向けに考えていたので、Android3.0以上となっても問題ありません
(上記のcanvas.toDataURL()もICS以上でしか使えないようですし)

ただ、単に利用可能なメモリが増えたから上限が増えた、というだけでは、どこかでメモリ不足で落ちる可能性が残ったままになります
実用上は問題なくなるかもしれませんが、問題を先送りするだけで解決にならないのは心残りなので、もう少し頑張ってみるつもりです



2012年12月27日 15:17 Hiroaki GOTO as GORRY <gorr...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages