Bitmapの保存とundoの保存について

203 views
Skip to first unread message

ruby

unread,
Sep 15, 2010, 10:07:22 PM9/15/10
to 日本Androidの会
皆様

お世話になっております。宮崎です。
2点程質問させていただきたいことがございます。
お忙しい中ではございますが、ご回答が頂ければ幸いです。

■Bitmapをbyte配列で取得する方法について
 現在Bitmap自体をファイルに保存しようと考えています。
 よく以下のようなコードでBitmapからJPEGに変換して
 ByteArrayOutputStreamから取り出すという手法があるかと思いますが、
 BitmapからJPEGに変換すると画像の劣化を起こすのが気になっています。

 ByteArrayOutputStream os=new ByteArrayOutputStream();
 bitmap.compress(Bitmap.CompressFormat.JPEG,100,os);
 out.write(os.toByteArray(),0,os.toByteArray().length);

 Bitmap→JPEG→Byteではなく、
 Bitmap→Byteに変換する方法はないでしょうか?
 ※なぜこうしたいのかは2個目の質問のためです。

■undoの保存について
 1番目で質問した事項ですが、画像加工アプリを作っていると
 undoを無限に持つことはできないため(ヒープメモリ的な意味合いで)
 いくつか手法を考えましたが、皆様どのようにundoを保存しようと考えますでしょうか?
 何点か考えてみましたが、どれも難しい点があります。
 皆様でいい手法等がありましたら、ご教授頂ければと思います。

 1.Bitmapをそのまま配列に保存してその分をundoリストとしてキャッシュする。
  →最初はいい案かと思いましたが、Bitmap自体がでか過ぎるので、
   ヒープメモリが落ちてしまう可能性が高いです。

 2.Bitmapをファイルシステム上で保存する。
  →1つ目の質問でかかってくるのですが、これならば画像自体をヒープメモリに
   持たないため、SDカードや端末サイズまではある程度undoリストは保持できる!
   と思いましたが、Bitmap→JPEG→Byte→ファイル保存としているため、
   画像がどんどん劣化してしまいます。劣化しなければありかと思ったのですが・・・

さきら

unread,
Sep 16, 2010, 4:15:32 AM9/16/10
to 日本Androidの会
さきらと申します。画像関係アプリもいくつか作ってます。

1. PNGで保存してはいかがでしょう? PNGなら劣化ないかと思います。

2. undoについて、画像加工アプリが具体的にどのようなものか
わからないので推測で書いてしまいますが、
例えば各操作に再現性がある、つまり、同じ操作をすれば
同じ結果(画像)になるのであるとします。
また、各操作にかかるコストは少ないとします。

だとすれば、加工する前の画像と、その手順の列だけを保存しておけば、
1回undoは手順の列の最後一個以外の実行結果、
2回undoは手順の列の最後1個と2個以外の実行結果となります。
多分、手順の情報はそんな場所取らないんじゃないでしょうか。

あんまり列が長くなるようでしたら、「もとの画像」にその手順の
途中まで適用した結果を改めて「もとの画像」にして、
手順の列の方は適用したとこまでを捨てるとか。

あんまり参考にならなかったらごめんなさい。

Miyazaki Yoshiaki

unread,
Sep 16, 2010, 4:47:49 AM9/16/10
to android-g...@googlegroups.com
さきら様
 
お世話になっております。宮崎です。
以下の件すごく参考になりました!
この問題に2日間悩みまくってしまいました・・・
 
>1. PNGで保存してはいかがでしょう? PNGなら劣化ないかと思います
そ、その手が!JPEGでばっかり保存していましたが、画像保存方式を見たら、PNGは可逆圧縮方式
なのですね・・・こいつは気づきませんでした・・・
 
>2. undoについて、画像加工アプリが具体的にどのようなものか
>  わからないので推測で書いてしまいますが、
>  例えば各操作に再現性がある、つまり、同じ操作をすれば
>  同じ結果(画像)になるのであるとします。
>  また、各操作にかかるコストは少ないとします。
>  だとすれば、加工する前の画像と、その手順の列だけを保存しておけば、
>  1回undoは手順の列の最後一個以外の実行結果、
>  2回undoは手順の列の最後1個と2個以外の実行結果となります。
>  多分、手順の情報はそんな場所取らないんじゃないでしょうか。
>  あんまり列が長くなるようでしたら、「もとの画像」にその手順の
>  途中まで適用した結果を改めて「もとの画像」にして、
>  手順の列の方は適用したとこまでを捨てるとか。
  基本的には保存するまでの一連の流れを保存するようなイメージで、
  undoを考えています。
  1つ1つの操作のみであれば、ご指摘とおり手順を覚えておくことに対しての
  ヒープメモリは大したことはないのは非常に同意できます。
  
  ただ、画像加工(例:グレースケール・セピア・モザイク・明るさ)を
  行うと、1回辺りの処理時間に200~500msec程度かかってしまい、
  どうしたものか非常に考えてしまいました。※
  ※これをやる場合はおそらくAsyncTaskやThreadなどでバッググラウンドで
   画像加工を行うのがいいかと思います。
  1番目にご回答頂いたPNGなら画像劣化がそもそもないので、ファイル形式で覚えるのでも
  良いかなと思っています。(undoで時間がかかるのも問題がある気がしているため)
  問題は端末のエリアが圧迫されるので、onDestoryタイミングやアプリ起動時にゴミを
  削除しなければならないのが難点ですが・・・

2010年9月16日17:15 さきら <sakis...@gmail.com>:

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


mosaki4

unread,
Sep 19, 2010, 7:45:06 AM9/19/10
to android-g...@googlegroups.com
大崎といいます

ちょっと興味がでて検証してみました

SoftReferenceを使えばキャッシュファイルとメモリを効率的に使えるかと
思って試してみましたが、画像の容量が多いためか
GCでがんがん消えているようでほとんど効果がないようでした
(100枚の画像のうち数枚だけメモリから読み込む)

getCacheDirメソッドを使えば
該当アプリのローカルキャッシュに保存できるようです
設定画面の該当アプリの「キャッシュを消去」で消せるようになる

パソコンと違って処理速度・メモリ・容量に制限があるので
なかなか完全なUndo機能は難しいかもしれません
(完全にするとキャッシュ削除にすごく時間がかかる等)

限定的なUndo機能(上限5回前までとか)なら
問題がなさそうなので検討されてみてはいかがでしょうか?


2010年9月16日17:47 Miyazaki Yoshiaki <ymiyaz...@gmail.com>:

ruby

unread,
Sep 20, 2010, 9:40:06 PM9/20/10
to 日本Androidの会
大崎さん

お世話になっております。宮崎です。
>
> SoftReferenceを使えばキャッシュファイルとメモリを効率的に使えるかと
> 思って試してみましたが、画像の容量が多いためか
> GCでがんがん消えているようでほとんど効果がないようでした
> (100枚の画像のうち数枚だけメモリから読み込む)

確認していた通りSoftReferenceでは画像枚数が多くなった際に削除&GCをしてくれるため
undoの機能としては難しいものがあるかと思い選択出来ませんでした。
(undoで途中でundo内容が飛ぶのは許されないことかと思い・・・)

> getCacheDirメソッドを使えば
> 該当アプリのローカルキャッシュに保存できるようです
> 設定画面の該当アプリの「キャッシュを消去」で消せるようになる
>
> パソコンと違って処理速度・メモリ・容量に制限があるので
> なかなか完全なUndo機能は難しいかもしれません
> (完全にするとキャッシュ削除にすごく時間がかかる等)
>
> 限定的なUndo機能(上限5回前までとか)なら
> 問題がなさそうなので検討されてみてはいかがでしょうか?
ご指摘の通りかと思います。
これを使うのが一番ベストかと思いながらも
アプリケーション領域のfilesディレクトリに書き込む方法で悩みました。
キャッシュディレクトリ or アプリケーションディレクトリで迷いました。

キャッシュディレクトリは勝手に削除されてしまうという所と悩み、
現在はアプリケーションディレクトリに格納しています。
undoを限定的にするべきか迷ったところがありつつも
画像ファイルのキャッシュという所で勝手に削除される可能性がある
ディレクトリを使うべきかも悩んでしまったからです。

以下のサイトを参考にしてみました。(Developersの日本語訳サイトでございます)
http://www.techdoctranslator.com/android/guide/data-storage


On 9月19日, 午後8:45, mosaki4 <mosa...@gmail.com> wrote:
> 大崎といいます
>
> ちょっと興味がでて検証してみました
>
> SoftReferenceを使えばキャッシュファイルとメモリを効率的に使えるかと
> 思って試してみましたが、画像の容量が多いためか
> GCでがんがん消えているようでほとんど効果がないようでした
> (100枚の画像のうち数枚だけメモリから読み込む)
>
> getCacheDirメソッドを使えば
> 該当アプリのローカルキャッシュに保存できるようです
> 設定画面の該当アプリの「キャッシュを消去」で消せるようになる
>
> パソコンと違って処理速度・メモリ・容量に制限があるので
> なかなか完全なUndo機能は難しいかもしれません
> (完全にするとキャッシュ削除にすごく時間がかかる等)
>
> 限定的なUndo機能(上限5回前までとか)なら
> 問題がなさそうなので検討されてみてはいかがでしょうか?
>
> 2010年9月16日17:47 Miyazaki Yoshiaki <ymiyazaki...@gmail.com>:
> > 2010年9月16日17:15 さきら <sakisak...@gmail.com>:
>
> >> さきらと申します。画像関係アプリもいくつか作ってます。
>
> >> 1. PNGで保存してはいかがでしょう? PNGなら劣化ないかと思います。
>
> >> 2. undoについて、画像加工アプリが具体的にどのようなものか
> >> わからないので推測で書いてしまいますが、
> >> 例えば各操作に再現性がある、つまり、同じ操作をすれば
> >> 同じ結果(画像)になるのであるとします。
> >> また、各操作にかかるコストは少ないとします。
>
> >> だとすれば、加工する前の画像と、その手順の列だけを保存しておけば、
> >> 1回undoは手順の列の最後一個以外の実行結果、
> >> 2回undoは手順の列の最後1個と2個以外の実行結果となります。
> >> 多分、手順の情報はそんな場所取らないんじゃないでしょうか。
>
> >> あんまり列が長くなるようでしたら、「もとの画像」にその手順の
> >> 途中まで適用した結果を改めて「もとの画像」にして、
> >> 手順の列の方は適用したとこまでを捨てるとか。
>
> >> あんまり参考にならなかったらごめんなさい。
>
> >> --
> >> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> >> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> >> このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> >> 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
>
> > --
> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-group-j...@googlegroups.com<android-gro-up-japan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Reply all
Reply to author
Forward
0 new messages