2011-01-18 24 views
1

画像操作アプリケーション(例えば、ぼかし、回転、拡大縮小、マージ、フラッディングなどの操作)を作成しています。メモリ使用が心配です。画像操作アプリケーションのメモリ使用率

私が抱えている問題は、ビットマップ+キャンバスを使用してイメージを操作するために既存の機能を利用できるようにする必要があることです。ピクセルを変更するためにイメージのコピーをint配列に配置する必要もありますぼかしや洪水のような操作のためにset/getPixel関数を使ってビットマップを変更するには遅すぎます。

私の現在のメモリ使用量がある:

  • 画像自体のビットマップオブジェクト。
  • Canvasを使用して画像操作タスクを実行するために使用するオフスクリーンのBitmapオブジェクトです。
  • マスキングに使用されるアルファ専用ビットマップ。
  • それぞれがメインイメージのコピーを格納するのに十分なピクセルを持つ2つのint配列。例えば

、Iは、フラッドフィルオペレーションを実行するために2つのint型の配列を使用します。私は、階調表現が作成された他のアレイ(メイン画像のグレースケールバージョンを入れて一列に主画像をコピーオフスクリーンのBitampとCanvasを最初に使用して)、カラー比較を行うときにグレースケールイメージを使用して、最初の配列でフラッドフィル操作を実行し、最終イメージをメインイメージのBitmapにコピーし直します。おそらくこの操作のためにオフスクリーンビットマップを削除することができます。私はペイント操作を実行するためにオフスクリーンビットマップを使用します。

メモリ使用量を減らすために使用できる手口はありますか?たとえば、ビットマップオブジェクトのint配列コピーを作成することを含まないピクセルを簡単に修正する方法はありますか? Canvasオブジェクトを使用してint配列を直接変更できますか?

レイヤ機能を追加したい(つまり、メインイメージはいくつかのビットマップで構成されます)が、私はすでにメモリが足りなくなっています。

+0

マトリクスとカラーマップ/カラーフィルタを使用して、これらの操作のいくつか(すべて?)を実行できます。これはかなり高度な話題だと私は考えていますので、それをうまく使う方法を学ぶ日/週を費やす準備をしてください。 – user432209

+0

もう少しヒントを教えてください。私はすでにcolormatricesについて知っていて、私はこれらがここでどのように役立つか分かりません。 – rbcc

答えて

0

2つのint配列をどのように使用しているかによって、それらをバイト配列にすることを検討できます。繰り返しますが、使用目的に応じて、バイナリマスクを使用して各バイトに複数のビットフラグを格納することができます。また、境界検出をどのように機能させるかに応じて、フラッドフィル操作に使用するイメージの1ピクセルあたりのビット数を減らすことができます。 HTH