0

カスタム カメラ ビューの実装に問題があります。

私が達成したいタスクは、カメラ プレビューでプレビュー画像を取得したことです (previewcallback 関数で)。ズームしてから、ズームしたバージョンの画像をカメラ ビューに描画します。

previewcallback 関数では、画像のピクセル値をバイト配列として取得しました。しかし、canvas.drawImage では int 配列を受け入れます。プレビューコールバック関数内のバイト配列でピクセルデータがどのように編成されているか教えてもらえますか?

サーフェスビューをロックしようとしましたが、役に立ちませんでした。null を返すため、そのサーフェスには何も描画できません。

助言がありますか?ありがとう。

4

2 に答える 2

2

プレビューコールバックからのピクセルデータが編成される方法は、プレビュー形式が何に設定されているかによって異なります。デフォルトでは、これはNV21であり、Androidデバイス間で最も互換性のあるオプションです。たとえば、この形式の詳細については、こちらをご覧ください。

しかし、大まかに言って、画像データはYCbCr形式であり、キャンバスが必要とするより一般的なRGBカラーエンコーディングではありません。あなたがする必要があります

  1. YCbCrバイト値をRGB値に変換します(式はウィキペディアにあります) 。
  2. CbおよびCr(カラー)チャンネルをフル解像度にアップサンプリングします。Y(輝度)チャンネルの幅と高さの1/2に縮小されています。最も簡単なオプションは、最近傍のアップサンプリングを使用することです。4つの異なるY値に同じCb値とCr値を使用します。したがって、CbチャネルとCrチャネルのピクセル(0,0)をYチャネルのピクセル(0,0)、(1,0)、(0,1)、および(1,1)とペアにして、フル解像度の画像。
于 2012-10-08T07:17:58.523 に答える
1

前述のように、NV21 はデフォルトであり、常に提供する必要があります。これは、NV21 を信頼できることを意味し、他のデバイスとの互換性を維持したい場合は、NV21 を信頼する必要があります。サーフェス ビューのロックについて - プレビューに使用しているサーフェス ビューは、カメラ アプリケーション (ネイティブであり、独自のプロセスで実行される) によって既にロックされているため、使用できません - 使用したい場合は、プレビューを停止する必要があります。カメラアプリがこのサーフェスを解放するようにします(うまくいけば)

悪いニュースは、フレーム レイアウトで最初のサーフェス ビューの上に別のサーフェス ビューを配置できないことです (これはサーフェス ビューの制限であり、オーバーラップできません)。良いニュースは、イメージ ビューを配置して、そこにビットマップを描画できることです(経由 runOnuiThread())

これを行う方法の例は、 javaOCR プロジェクトで見つけることができます。

(Android のデモを参照してください。最新の git repo を使用してください)

于 2012-10-08T07:28:52.767 に答える