Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(YUV420データをBitmapに変換する)
閲覧数:572
掲示板(YUV420データをBitmapに変換する)
名前
匿名
題名 YUV420データをBitmapに変換する
質問内容

質問を評価する
(0ポイント)
android4.2.2のgalaxy s4で実機テストをしている
プログラミング初心者です。

カメラプレビューから画像を取得し、
YUV420データをBitmapに変換してから
その画像を保存したいのですが、
赤と緑が入り混じった砂嵐のような画像が
保存されてしまいます。

私の知識では解決できないと思い、
ここに相談させていただきます。
よろしくお願いします。

また、変換のために用いているコードは
ネット上で拾ったものを使用しています。
質問日時 2013-08-05 01:43:59
名前
匿名
回答内容

回答を評価する
(0ポイント)
保存する前に画面に出してみるくらいはしたのかね。
せめてそれくらいは切り分けてみたらどうだ?
プログラムは機能の組み合わせであり、それぞれの機能が
正常に動かなければ全体として正常には動かない。
全体が正常でないなら、まずはどこの機能がおかしいのか、
切り分けることから始める。

現時点のコードすら出さないってことは、コードそのものを
要求してるようだが、ここは答えを聞くところではないし、
コードがそのまま書かれることは少ない。
(ここは楽をするために質問する場所ではないってこと)
回答日時 2013-08-05 08:23:11
名前
匿名
回答内容

回答を評価する
(0ポイント)
カメラプレビューでの方法を選択されたのですね。

変換といわれているのはカラーコード変換だと思うので、
その変換をかける前の状態で画像保存をしてみてください。

その時点で砂嵐であれば、変換以前の実装に何か誤りがあります。
色味がおかしいけど正しい絵が保存できてれいば、カラーコード変換
の誤り(よくあるのはシフト演算間違いとか)の可能性があります。



回答日時 2013-08-05 10:23:28
名前
匿名
回答内容

回答を評価する
(0ポイント)
丁寧な回答をありがとうございます。
お二人にご指摘いただいたように
変換する前の状態で画想を保存したところ
同じような画像が保存されました。

プレビューはできているので、
setPreviewCallback()が間違っているのでしょうか?

現在の実装ではボタンが押されたときに
setPreviewCallback()を呼び出す実装になっていて
そのコールバック内のonPreviewFrameで
保存を行うような形になっています。

また、onPreviewFrameでは
setPreviewCallback(null)
stopPreview()を行ってから
保存処理をしています。
回答日時 2013-08-05 12:25:56
名前
匿名
回答内容

回答を評価する
(0ポイント)
追記
保存処理のコードは以下です。

int format = 
camera.getParameters().getPreviewFormat();
  
YuvImage image = 
new YuvImage(data, format, 720, 720, null);
Rect rect = new Rect(0, 0, 720, 720);
               

String root = 
Environment.getExternalStorageDirectory()
+"/DCIM/main/";

Date mDate = new Date();

SimpleDateFormat fileName = new 
SimpleDateFormat("yyyyMMdd_HHmmss");

 FileOutputStream fos = null;

try {
fos = new FileOutputStream
(new File(root, fileName.format(mDate) + ".jpg"));
    } catch (FileNotFoundException e1) {
            Log.e("CAMERA", e1.getMessage());
        e1.printStackTrace();
                   }

try    {
image.compressToJpeg(rect, 100, fos);    
fos.close();
               
    } catch (FileNotFoundException e) {
               Log.e("CAMERA", e.getMessage());
               e.printStackTrace();
                                     } 
catch (IOException e) {
                      e.printStackTrace();
                    }
回答日時 2013-08-05 12:56:17

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道