2016-11-22 1 views
0

私がこれまで開発してきたのは、以下のような標準のDngCreatorスキームを使用してさまざまなデバイスの生の情報を書き出す機能です。ローストライド>幅のカメラでRawをCamera2で省く

ただし、私が遭遇しているデバイス(HTC 10)では、Imageクラスには行の幅が幅よりも大きい平面情報が含まれています。私はこれまで画像で起こりうることを理解していますが、私たちが利用できるSDKを使ってそれを修正する方法を見つけることはできません。

ByteBuffer byteBuffer = ByteBuffer.wrap(cameraImageF.getRawBytes()); 
byteBuffer.rewind(); 
dngCreator.writeByteBuffer(new FileOutputStream(rawLoggerFileF), 
       new Size(cameraImageF.getRawImageSize().getWidth(), cameraImageF.getRawImageSize().getHeight()), 
       byteBuffer, 0); 

Iは、元Imageクラスからバイトに保持され、私はそれを受信し、それらを撮影したとき(これはアプリケーションの点である)場合との間で、いくつかの実質的な計算を行うています。だから、私はImageを手放さなければならないので、カメラから別のフレームを取得し続けることができます。

このアプローチは、さまざまなデバイス(Samsung S7、Nexus 5、Nexus 6pなど)でうまく機能します。しかし、HTC 10では、ストライドは1行につき16バイト長くなり、あたかも私にDngCreatorを知らせる方法がないように思えます。

ソースコードの下にあるwriteBufferのデフォルト値は、内部でrowStride = width * pixelStrideです。私はパラメータのために異なるストライドを送る能力を持っていません。 rowStrideはデフォルトと等しくありません。

dngCreator.saveImage(Outputstream, Image)は、バッファに書き出すときに内部Imageのストライドを使用します。しかし、私は解放する必要があり、クローン可能なオブジェクトではないので、カメラのImageクラスを保持することはできません。

rowStride> widthの写真の場合、有効な.dngの書き方を少し紛失して理解しようとしています。

答えて

1

余分なバイトを手動で削除する必要があります。つまり、生のイメージを新しいByteBufferにコピーし、各行の最後に余分なバイトを削除する必要があります。だから、のようなもの:もちろんないパフォーマンスのために素敵ですが、DngCreatorはあなたがByteBufferのインターフェイスを持つ行のストライドを指定できないので、それはあなたの唯一のオプションです

byte[] rawBytes = cameraImageF.getRawBytes(); 
ByteBuffer dst = ByteBuffer.allocate(cameraImageF.getRawImageSize().getWidth() * cameraImageF.getRawImageSize().getHeight() * 2); 
for (int row = 0; row < cameraImageF.getRawImageSize().getHeight(); row++) { 
    dst.put(rawBytes, 
     row * cameraImageF.getRawImageRowStride(), 
     cameraImageF.getRawImageSize().getWidth() * 2); 
} 
dst.rewind(); 
dngCreator.writeByteBuffer(new FileOutputStream(rawLoggerFileF), 
      new Size(cameraImageF.getRawImageSize().getWidth(), 
        cameraImageF.getRawImageSize().getHeight()), 
      dst, 0); 

RAW ImageReaderのmaxCountを高くして、処理が完了するまでImageを保持できる理由はありますか?

+0

ありがとう、私はこのルートに行く必要があります。多分私は 'maxCount'パラメータとその目的が何のためにあるのか理解できませんでした。それがどのように機能するのかということであれば、 'Image'クラスを維持するために、私のコンテナを変更してそれを調べてみましょう。 –

+0

ImageReaderのmaxCount引数は、システムに戻す前に同時に保持できる画像の数を定義します。 ImageReaderは、下の循環バッファです。より多くの画像を保持するほど、メモリ消費量は大きくなります。また、イメージをすばやく解放しないと、カメラは次のキャプチャのイメージデータを置くことができません(停止します)。したがって、イメージをキャプチャするのと同じ速度でイメージをリリースする必要がありますが、maxCountを増やすと、各イメージを処理パイプラインで長く保持できます。 –

関連する問題