1

拡張子が .raw (生の画像形式) のファイルがありますが、開くことができません。コマンドファイル filename.rawexiv2 printexiftoolufrawdcrawで分析しようとしました。バイナリ ファイルのように見えるため、文字列 filename.rawhexdump、およびxxdを使用して情報を抽出しようとしました。ファイルにメタデータがないように見えるのは驚くべきことです。ファイル拡張子が間違っていて、ファイルが操作されていると思われます。

他にどのようにタイプを判断できますか? どうすれば情報を抽出できますか?

ご提案いただきありがとうございます。

編集: サンプル ファイルは、 ここからダウンロードできます。

4

1 に答える 1

1

うーん...まあ、

//ファイルのバイト数から判断すると:

// 1447600

//この番号は正確です。

// 3 x 499 x 967

//これは非常に奇妙ですが、これが画像の場合は、ピクセルあたり3バイトで、499x967または967x499のいずれかである必要があります。

編集:解像度が間違っています。おそらくチャネルあたりのビット数も、これは私がbcWAの代わりに深夜に使用するために取得するものです。

実際の係数は2^4 * 5 ^ 2 * 7 * 11 * 47です。これは、ピクセルあたり3バイトにすることはできないことを意味します。ストリームの圧縮が行われている可能性がありますか?しかし、おそらくそうではないでしょう、数はあまりにもいいです。

一部のデータを見ると、ほとんどのデータは非常にノイズが多く、ノイズの多いデジタルセンサーを備えたカメラに適合します。

00000000  0e 08 06 02 04 06 00 02  00 04 01 04 0e 03 05 01  |................|
00000010  03 01 06 04 00 03 01 05  01 00 02 00 06 02 04 01  |................|
00000020  00 07 0c 0d 05 01 0a 0d  03 08 11 08 0c 03 06 06  |................|
00000030  08 02 07 04 01 01 07 02  05 06 10 04 07 01 04 02  |................|
00000040  02 01 0c 09 07 02 05 01  0d 04 00 05 0e 01 00 07  |................|
00000050  00 02 04 0a 11 04 07 04  01 00 0d 07 0f 06 03 02  |................|
00000060  06 04 0a 0b 03 08 02 0c  00 08 00 04 06 09 03 03  |................|
00000070  04 00 0a 04 01 06 00 00  02 08 0a 07 04 09 01 0b  |................|
00000080  01 0c 0d 04 03 03 05 00  02 11 09 00 07 08 08 05  |................|
00000090  04 07 02 0c 00 13 01 06  07 02 08 0a 07 05 02 01  |................|

ファイルの先頭にあるこの領域は、すべて黒に近い可能性があります。

したがって、一般的な3バイト/ピクセル形式のうち、BGR24、RGB24、またはYUV24があります。

RGBまたはBGR形式を処理する方が簡単なので、libpngを使用して、これをpngにダンプするための短いコードを作成してみましょう。

初挑戦:

#include <png.h>
#include <exception>
#include <memory>

int main() {
  FILE * fpout;
  FILE * fpin;
  png_structp png_ptr = nullptr;
  png_infop info_ptr = nullptr;
  const unsigned width = 499;
  const unsigned height = 967;
  const unsigned channels = 3;

  fpin = fopen("sample.raw", "rb");
  if (!fpin)
    throw std::exception();

  std::unique_ptr<char[]> data(new char[width*height*channels]);
  fread(data.get(), width*height*channels, 1, fpin);
  fclose(fpin);

  fpout = fopen("output.png", "wb");
  if (!fpout)
    throw std::exception();

  png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
  if (!png_ptr) {
    fclose (fpout);
    throw std::exception();
  }

  info_ptr = png_create_info_struct(png_ptr);
  if (!info_ptr) {
    png_destroy_write_struct(&png_ptr, nullptr);
    fclose (fpout);
    throw std::exception();
  }

  if (setjmp(png_jmpbuf (png_ptr))) {
    png_destroy_write_struct(&png_ptr, &info_ptr);
    fclose (fpout);
    throw std::exception();
  }

  png_set_IHDR(png_ptr,
      info_ptr,
      width,
      height,
      8,
      PNG_COLOR_TYPE_RGB,
      PNG_INTERLACE_NONE,
      PNG_COMPRESSION_TYPE_DEFAULT,
      PNG_FILTER_TYPE_DEFAULT);

  /* Initialize rows of PNG. */

  std::unique_ptr<png_bytep[]> row_ptrs(new png_bytep[height]);
  size_t stride = width * 8 * channels / 8;
  for (size_t i = 0; i < height; ++i) {
    size_t q = i * stride;
    row_ptrs[i] = (png_bytep)data.get() + q;
  }

  /* Write the image data to "fp". */

  png_init_io(png_ptr, fpout);
  png_set_rows(png_ptr, info_ptr, row_ptrs.get());
  png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, nullptr);

  png_destroy_write_struct(&png_ptr, &info_ptr);
  fclose (fpout);
}

私たちに与える:

http://i.imgur.com/Iwi3M.jpg

解像度が間違っているだけのように見えるので、これは心強いです。したがって、画像を見ると、バーは467ピクセルごとに繰り返されているように見えます。ただし、データに興味深いものはないようです。したがって、単純なRBG、BGR、またはYUVエンコーディングではない可能性があります。そうでない場合は、見栄えが良くなります。

生の治療者はそれを認識しません。だから、私は今あなたに尋ねています。これを作るためにどのカメラを使用しましたか?

于 2012-12-17T09:09:45.567 に答える