none
視覚暗号の画像プログラミングについて RRS feed

  • 質問

  • 現在、visualC++で視覚暗号の画像を作成しているのですが、どのようにプログラムを組めばいいか全然分かりません。完成系は黒文字のHITの3文字+背景が"テレビでいう砂嵐である"プログラムなのですが、完成するには、まだまだ程遠いです。大学の図書館に視覚暗号の本があるのですが、プログラミングに関する本がどこにもありませんでした。今回の視覚暗号のプログラミングは白の基本行列、黒の基本行列、秘密画像(テレビでいう砂嵐の画像)の行列の作成、そして、forループ文を使うというのは確実です。視覚暗号のプログラムを組める人は協力お願いします。

    2013年7月18日 9:51

回答

  • やりたいことをそのまま書いてある書籍、Web ページが見つからないはそんなものです。何でも見つかるようであれば、誰もプログラムを書く必要はありませんので…。
    (基礎的な作り方や誰もが通る道に関しては前人の情報、サンプルソースが見つかりますが、学術研究的なもの、世の中にないものは見つからないものです)

    さて、技術的な説明なのか、アルゴリズムの解説なのかわかりませんが、書籍にはどの程度の事柄が書かれているのでしょうか。
    そして、あなたはその書籍をどこまで理解しているのでしょうか?

    プログラムに書けなくても、どういった原理でどのようにすれば実現できるかを文章で表現できるのであれば、それに対する助言を得られるかもしれません。
    逆に、文章で人に説明できない状態ではフォーラムでの解決はかなり困難です。まずは、近場の人(同僚・上司・先生など)に相談することから始めてください。

    • 回答の候補に設定 星 睦美 2013年7月23日 6:44
    • 回答としてマーク 星 睦美 2013年7月26日 2:11
    2013年7月18日 13:31
    モデレータ
  • 例えば文字列で、かつ復元が簡単なxor演算でやってみると、

    char hit[ 4]   = { 0x48, 0x49, 0x54, 0x00}; // "HIT"
    char 画像A[ 4] = { 0xAA, 0x55, 0xAA, 0x55}; // という背景データがあった場合
    char 画像B[ 4]; // 画像Bを作成
    for( int i=0 ; i<3 ; i++){
       画像B[ i] = 画像A[ i] xor hit[ i]; // xorの逆演算はxor
    }
    となります。
    ユーザーに提示するのは
    画像A[ 4] = { 0xAA, 0x55, 0xAA, 0x55};
    画像B[ 4] = { 0xE2, 0x1C, 0xFE, 0x55};
    で、復元するには、両者をxorするわけですね。
    原理的にはこんなんでよろしいでしょうか。

    本件の場合、これらをビットマップで行うわけで、
     1."HIT"と書かれたターゲット画像。
     2.背景となる何らかの「画像A」。
     3.上記2画像からある論理(逆演算可能なもの)で算定された「画像B」。
    などのリソースが必要となります。

    仕様上はこれをユーザーに提示しなければならないので、
     4.「画像A」と「HIT画像」から「画像B」を作成するエンコーダアプリ。
     5.「画像A」と「画像B」から「HIT画像」を復元する、デコーダアプリ。
    が必要です。このあたりは大丈夫ですね。
    これらを作成するには
     6.対象言語の標準的知識(本件の場合C++)。
     7.それを使っての、標準的Windowsアプリケーション作成能力。
     8.ビットマップの仕組みと表示を含むそれを運用する知識。
     9.当該暗号化の仕組みの理解。
    が必要ですが、ご自分に不足しているものを理解し、
    完成に至るスケジュールを線引きしてみましょう。

    • 回答の候補に設定 星 睦美 2013年7月23日 6:44
    • 回答としてマーク 星 睦美 2013年7月26日 2:17
    2013年7月19日 1:46

すべての返信

  • C++ でなければいけないのでしょうか?

    2013年7月18日 9:55
  • C++で今やっているのでC++でお願いできませんか?
    2013年7月18日 9:57
  • C++ の場合、目的の「視覚暗号の画像を作成」とはおそらく全く関係のないことについて理解しなければならないことが、(少なくともほかの手段に較べれば)てんこ盛りです。そうした回り道してでも C++ で実装する必要性が、「C++ で今やっているので」以上の必要性が、あるのでしょうか?

    …と思ったまでで。

    2013年7月18日 10:15
  • C++かどうかにかかわらず、画像を扱うということは、画像形式や画像ファイルの読み書き、もしくはGUIアプリケーションの作成などが必要になるように思われます。

    「視覚暗号」のスタートラインに辿り着くまでにはかなり遠くありませんか? 何の「協力」を求めればいいかご自身で把握できていますか?

    • 回答の候補に設定 佐祐理 2013年7月24日 22:49
    2013年7月18日 10:41
  • 前の先輩がその視覚暗号のプログラミングが完成出来なかったので、その引継ぎなんですが、画素の白と黒の基本行列をプログラミングでどのように打ち込めばいいか全く分かりません。本にもインターネットも調べたんですけど、どこにも載っていません。ウィンドウ画面はプログラミングで完成しました。
    2013年7月18日 12:13
  • やりたいことをそのまま書いてある書籍、Web ページが見つからないはそんなものです。何でも見つかるようであれば、誰もプログラムを書く必要はありませんので…。
    (基礎的な作り方や誰もが通る道に関しては前人の情報、サンプルソースが見つかりますが、学術研究的なもの、世の中にないものは見つからないものです)

    さて、技術的な説明なのか、アルゴリズムの解説なのかわかりませんが、書籍にはどの程度の事柄が書かれているのでしょうか。
    そして、あなたはその書籍をどこまで理解しているのでしょうか?

    プログラムに書けなくても、どういった原理でどのようにすれば実現できるかを文章で表現できるのであれば、それに対する助言を得られるかもしれません。
    逆に、文章で人に説明できない状態ではフォーラムでの解決はかなり困難です。まずは、近場の人(同僚・上司・先生など)に相談することから始めてください。

    • 回答の候補に設定 星 睦美 2013年7月23日 6:44
    • 回答としてマーク 星 睦美 2013年7月26日 2:11
    2013年7月18日 13:31
    モデレータ
  • 例えば文字列で、かつ復元が簡単なxor演算でやってみると、

    char hit[ 4]   = { 0x48, 0x49, 0x54, 0x00}; // "HIT"
    char 画像A[ 4] = { 0xAA, 0x55, 0xAA, 0x55}; // という背景データがあった場合
    char 画像B[ 4]; // 画像Bを作成
    for( int i=0 ; i<3 ; i++){
       画像B[ i] = 画像A[ i] xor hit[ i]; // xorの逆演算はxor
    }
    となります。
    ユーザーに提示するのは
    画像A[ 4] = { 0xAA, 0x55, 0xAA, 0x55};
    画像B[ 4] = { 0xE2, 0x1C, 0xFE, 0x55};
    で、復元するには、両者をxorするわけですね。
    原理的にはこんなんでよろしいでしょうか。

    本件の場合、これらをビットマップで行うわけで、
     1."HIT"と書かれたターゲット画像。
     2.背景となる何らかの「画像A」。
     3.上記2画像からある論理(逆演算可能なもの)で算定された「画像B」。
    などのリソースが必要となります。

    仕様上はこれをユーザーに提示しなければならないので、
     4.「画像A」と「HIT画像」から「画像B」を作成するエンコーダアプリ。
     5.「画像A」と「画像B」から「HIT画像」を復元する、デコーダアプリ。
    が必要です。このあたりは大丈夫ですね。
    これらを作成するには
     6.対象言語の標準的知識(本件の場合C++)。
     7.それを使っての、標準的Windowsアプリケーション作成能力。
     8.ビットマップの仕組みと表示を含むそれを運用する知識。
     9.当該暗号化の仕組みの理解。
    が必要ですが、ご自分に不足しているものを理解し、
    完成に至るスケジュールを線引きしてみましょう。

    • 回答の候補に設定 星 睦美 2013年7月23日 6:44
    • 回答としてマーク 星 睦美 2013年7月26日 2:17
    2013年7月19日 1:46
  • フォーラム オペレーターの星 睦美です。
    emerald111 さん、こんにちは

    同様の質問がインターネットにありますので、参考までにご紹介します。

    (参考情報)
    ・視覚暗号のプログラミングについて
    http://okwave.jp/qa/q8179892.html?by=datetime&order=DESC

    今回はコミュニティの回答者の方々から複数のアドバイスをいただいています。仲澤@失業者 さんからはプログラミングに取り組むために必要なポイントを挙げていただきました。良いヒントになるのではないかと思います。

    役立つ回答には、ぜひ投稿者から[回答としてマーク] いただければ幸いです。

    (7月22日 別のスレッドを統合しました。)


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美


    • 編集済み 星 睦美 2013年7月22日 0:40 スレッドの統合
    2013年7月19日 4:44
  • 現在、C++での秘密分散について取り組んでいるのですが、デバッグ結果がエラーばかりで苦労しています。完成形はプログラミングでノイズ画像の中にHITの3文字が表示されるプログラムです。一応プログラムコードは出来たので、アドバイスお願いします。

    #include<windows.h>
    #include<tchar.h>
    #include<stdio.h>
    #include<stdlib.h>


    #define WINDOW_WIDTH (315)
    #define WINDOW_HEIGHT (315)
    #define WINDOW_X 0
    #define WINDOW_Y 0

     
    HWND Create(HINSTANCE hInst);
    LRESULT CALLBACK WndProc(HWND hWnd, UINT nsg,WPARAM wp,LPARAM lp);


    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    {
     HWND hWnd;
     MSG msg;
     
     hWnd=Create(hInst);
     if(hWnd==NULL)
     {
      MessageBox(NULL,_T("ウィンドウの作成に失敗しました"),_T("エラー"),MB_OK);
      return 1;
     }

     ShowWindow(hWnd,SW_SHOW);
     UpdateWindow(hWnd);


     while(1)
     {
      BOOL ret=GetMessage(&msg,NULL,0,0);
      if(ret==0 || ret==-1)
      {
       break;
      }
      else
      {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
      }
     }

     return 0;

    }


    HWND Create(HINSTANCE hInst)
    {
     WNDCLASSEX wc;

     wc.cbSize=sizeof(wc);
     wc.style=CS_HREDRAW |CS_VREDRAW | CS_DBLCLKS;
     wc.lpfnWndProc=WndProc;
     wc.cbClsExtra=0;
     wc.cbWndExtra=0;
     wc.hInstance=hInst;
     wc.hIcon=(HICON)LoadImage(
      NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,
      0,0,LR_DEFAULTSIZE | LR_SHARED
      );
     (HBRUSH)(COLOR_WINDOW + 1);

            wc.hIconSm=wc.hIcon;
      wc.hCursor=(HCURSOR)LoadImage(
       NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,
       0,0,LR_DEFAULTSIZE | LR_SHARED

       );
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName=NULL;
    wc.lpszClassName =_T("Default Class Name");
    if(RegisterClassEx(&wc)==0){return NULL;}

      return CreateWindow(
       wc.lpszClassName,
       _T("視覚暗号"),

       WS_OVERLAPPEDWINDOW,
       WINDOW_X,
       WINDOW_Y,
       WINDOW_WIDTH,
       WINDOW_HEIGHT,
       NULL,
       NULL,
       hInst,
       NULL

       );

    }

    LRESULT CALLBACK WndProc(HWND hWnd,UINT nsg, WPARAM wp,LPARAM lp)
    {
    return DefWindowProc(hWnd, nsg, wp, lp);

    白の基本行列
    int a0[3][9]={{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0}},
        a1[3][9]={{1,0,0,1,0,0,0,1,0},{1,0,0,1,0,0,0,1,0},{1,0,0,1,0,0,0,1,0}},
        a2[3][9]={{1,0,0,1,0,0,0,0,1},{1,0,0,1,0,0,0,0,1},{1,0,0,1,0,0,0,0,1}},
        a3[3][9]={{1,0,0,0,1,0,1,0,0},{1,0,0,0,1,0,1,0,0},{1,0,0,0,1,0,1,0,0}},
        a4[3][9]={{1,0,0,0,1,0,0,1,0},{1,0,0,0,1,0,0,1,0},{1,0,0,0,1,0,0,1,0}},
        a5[3][9]={{1,0,0,0,1,0,0,0,1},{1,0,0,0,1,0,0,0,1},{1,0,0,0,1,0,0,0,1}},
        a6[3][9]={{1,0,0,0,0,1,1,0,0},{1,0,0,0,0,1,1,0,0},{1,0,0,0,0,1,1,0,0}},
        a7[3][9]={{1,0,0,0,0,1,0,1,0},{1,0,0,0,0,1,0,1,0},{1,0,0,0,0,1,0,1,0}},
        a8[3][9]={{1,0,0,0,0,1,0,0,1},{1,0,0,0,0,1,0,0,1},{1,0,0,0,0,1,0,0,1}},
        a9[3][9]={{0,1,0,1,0,0,1,0,0},{0,1,0,1,0,0,1,0,0},{0,1,0,1,0,0,1,0,0}},
        a10[3][9]={{0,1,0,1,0,0,0,1,0},{0,1,0,1,0,0,0,1,0},{0,1,0,1,0,0,0,1,0}},
        a11[3][9]={{0,1,0,1,0,0,0,0,1},{0,1,0,1,0,0,0,0,1},{0,1,0,1,0,0,0,0,1}},
        a12[3][9]={{0,1,0,0,1,0,1,0,0},{0,1,0,0,1,0,1,0,0},{0,1,0,0,1,0,1,0,0}},
        a13[3][9]={{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0}},
        a14[3][9]={{0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,0,1},{0,1,0,0,1,0,0,0,1}},
        a15[3][9]={{0,1,0,0,0,1,1,0,0},{0,1,0,0,0,1,1,0,0},{0,1,0,0,0,1,1,0,0}},
        a16[3][9]={{0,1,0,0,0,1,0,1,0},{0,1,0,0,0,1,0,1,0},{0,1,0,0,0,1,0,1,0}},
        a17[3][9]={{0,1,0,0,0,1,0,0,1},{0,1,0,0,0,1,0,0,1},{0,1,0,0,0,1,0,0,1}},
        a18[3][9]={{0,0,1,1,0,0,1,0,0},{0,0,1,1,0,0,1,0,0},{0,0,1,1,0,0,1,0,0}},
        a19[3][9]={{0,0,1,1,0,0,0,1,0},{0,0,1,1,0,0,0,1,0},{0,0,1,1,0,0,0,1,0}},
        a20[3][9]={{0,0,1,1,0,0,0,0,1},{0,0,1,1,0,0,0,0,1},{0,0,1,1,0,0,0,0,1}},
        a21[3][9]={{0,0,1,0,1,0,1,0,0},{0,0,1,0,1,0,1,0,0},{0,0,1,0,1,0,1,0,0}},
        a22[3][9]={{0,0,1,0,1,0,0,1,0},{0,0,1,0,1,0,0,1,0},{0,0,1,0,1,0,0,1,0}},
        a23[3][9]={{0,0,1,0,1,0,0,0,1},{0,0,1,0,1,0,0,0,1},{0,0,1,0,1,0,0,0,1}},
        a24[3][9]={{0,0,1,0,0,1,1,0,0},{0,0,1,0,0,1,1,0,0},{0,0,1,0,0,1,1,0,0}},
        a25[3][9]={{0,0,1,0,0,1,0,1,0},{0,0,1,0,0,1,0,1,0},{0,0,1,0,0,1,0,1,0}},
        a26[3][9]={{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1}},
         

    黒の基本行列

    int b 0[3][9]={{1,0,0,1,0,0,1,0,0},{0,1,0,0,1,0,0,1,0},{0,0,1,0,0,1,0,0,1}},
        b 1[3][9]={{1,0,0,1,0,0,1,0,0},{0,1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,0,0}},
        b 2[3][9]={{1,0,0,1,0,0,1,0,0},{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0}},
        b 3[3][9]={{1,0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1}},
        b 4[3][9]={{1,0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,0,1},{1,0,0,1,0,0,1,0,0}},
        b 5[3][9]={{1,0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,0,1},{0,1,0,0,1,0,0,1,0}},
        b 6[3][9]={{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,0,1}},
        b 7[3][9]={{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0}},
        b 8[3][9]={{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0},{0,1,0,0,1,0,0,1,0}},
        b 9[3][9]={{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0},{0,0,1,0,0,1,0,0,1}},
        b 10[3][9]={{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,0,0}},
        b 11[3][9]={{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0}},
        b 12[3][9]={{0,1,0,0,1,0,0,1,0},{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1}},
        b 13[3][9]={{0,1,0,0,1,0,0,1,0},{0,0,1,0,0,1,0,0,1},{1,0,0,1,0,0,1,0,0}},
        b 14[3][9]={{0,1,0,0,1,0,0,1,0},{0,0,1,0,0,1,0,0,1},{0,1,0,0,1,0,0,1,0}},
        b 15[3][9]={{0,1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,0,1}},
        b 16[3][9]={{0,1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0}},
        b 17[3][9]={{0,1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,0,0},{0,1,0,0,1,0,0,1,0}},
        b 18[3][9]={{0,0,1,0,0,1,0,0,1},{0,1,0,0,1,0,0,1,0},{0,0,1,0,0,1,0,0,1}},
        b 19[3][9]={{0,0,1,0,0,1,0,0,1},{0,1,0,0,1,0,0,1,0},{1,0,0,1,0,0,1,0,0}},
        b 20[3][9]={{0,0,1,0,0,1,0,0,1},{0,1,0,0,1,0,0,1,0},{0,1,0,0,1,0,0,1,0}},
        b 21[3][9]={{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1}},
        b 22[3][9]={{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1},{1,0,0,1,0,0,1,0,0}},
        b 23[3][9]={{0,0,1,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,1},{0,1,0,0,1,0,0,1,0}},
        b 24[3][9]={{0,0,1,0,0,1,0,0,1},{1,0,0,1,0,0,1,0,0},{0,0,1,0,0,1,0,0,1}},
        b 25[3][9]={{0,0,1,0,0,1,0,0,1},{1,0,0,1,0,0,1,0,0},{1,0,0,1,0,0,1,0,0}},
        b 26[3][9]={{0,0,1,0,0,1,0,0,1},{1,0,0,1,0,0,1,0,0},{0,1,0,0,1,0,0,1,0}},

    秘密画像の行列

    char c[21][35]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, 
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
                   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

     

    char d[315][315];

    HDC hDC;
    PAINTSTRUCT ps;
    SYSTEMTIME st;
    RECT rt;
    int i,j,m,n;

    GetLocalTime(&st);
    srand((unsigned)st.wMilliseconds);

    switch(msg)

    {
    case WM_PAINT:
     hDC=BeginPaint(hWnd,&ps);

     for(i=0;i<21;i++){
      for(i=0;j<35;j++){
       for(m=0;m<3;m++){
        for(n=0;n<9;n++){
         if(c[i][j]=0)

    a1[m][n]);           d[i*3][j*3+n]=(char)((int)c[i][j]
         else
    b1[m][n]);           d[i*3][j*3+n]=(char)((int)c[i][j]

         if(d[i*3][j*3+n]=1)
          SetPixelV(hDC,j*3+n,i*3,
         
      RGB(255,255,255));
        }

       }

      }
     }
     EndPaint(hWnd,&ps);
     return0;

    case WM_DESTROY:
     PostQuitMessage(0);
     return 0;
    }
    return DefWindowProc(hWnd,mes,wp,lp);

    • 結合 星 睦美 2013年7月22日 0:35 関連した質問
    2013年7月19日 8:25
  • 質問文が見当たりません。何を尋ねたいのでしょうか?
    • 回答の候補に設定 佐祐理 2013年7月24日 22:49
    2013年7月19日 11:03
  • よろしくないですねぇ。。。
    msn 相談箱他、「視覚暗号」で検索すると、ほぼ同じ文面の質問がちらほらと、、、(って、OKWAVE の質問があちこちのサイトで見えている訳なんだけど)。
    これもそうかな?ここがエメラルドで、(スペルが違うけど)サファイアだから、きっと同じですね。 yahoo 知恵袋

     ところで、視覚暗号の研究という PDF ファイルによると、「暗号化は、秘密画像を、2つのランダムな画像 A, B に分散符号化し、A をアリスに、 B をボブに渡すことにより行われます。復号化は、分散画像 A, B を単に重ね合わせることにより、復元するわけです。」と書かれています。ということは、OKWAVE にある「The University of ~」の画像は復号結果であって、テレビの砂嵐のような画像を作ることは暗号化の目的ではない、と思うのですが、いかがでしょう?たとえば、東京大学大学院総合文化研究科の山口泰教授のページを見ると、画像が3枚あります。あなたが「黒文字のHITの3文字+背景が"テレビでいう砂嵐である"」とおっしゃっているのは、どれに当たるのでしょう?


    Jitta@わんくま同盟

    2013年7月19日 13:01
  • このプログラムコードのどこが間違ってるかチェックしてもらえませんか?
    2013年7月19日 14:14
  • 一度、こちらのドキュメントを読んでみてください。
    メーリングリストを対象としたドキュメントではありますが、フォーラムや掲示板でも同様のことが言えます。

    http://www.hyuki.com/writing/techask.html

    2013年7月19日 14:18
    モデレータ
  • 類似スレッドとしてリンクしておきます。

    http://social.msdn.microsoft.com/Forums/ja-JP/042420a1-3e44-47be-b466-852a02088310

    2013年7月19日 14:19
    モデレータ
  • 何をもって「どこか間違っている」と判断されましたか? 逆に言えば正しい姿というのはどのようなものですか?

    例えば

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    {
      return 0;

    こう書き加えればエラーは出なくなります。質問文が成り立っていないというのはこういうことです。

    そもそも大学というところは研究機関であり、まだ答えの定まってないものを自ら見つける場です。他人に答えを求める行為そのものが間違っています。答えが見つかったとしてそれはあなたの成果なのですか?

    • 回答の候補に設定 佐祐理 2013年7月24日 22:49
    2013年7月19日 22:11
  • 類似スレッドとしてリンクしておきます。
    http://social.msdn.microsoft.com/Forums/ja-JP/793c4e1e-fc2b-408c-9e39-bf830e616d18
    2013年7月20日 11:22
    モデレータ
  • こっちは、ほったらかしですか?

    「デバッグ結果がエラーばかり」とは、どのような状態でしょうか。自分の置かれている状況を伝える努力をしてください。

    コード内の、たとえば「 (HBRUSH)(COLOR_WINDOW + 1);」ですが、何をしているのか、理解していますか?プログラムというのは、人が「こうして欲しい」と思っていることをコンピュータに伝える手紙です。ただ、どんな人にでもわかる言葉では書かれていないというだけです。あなたは、コンピュータに、どんな手紙を書いたのでしょう?自分で書いたことを理解できていますか?

    「完成形はプログラミングでノイズ画像の中にHITの3文字が表示されるプログラムです。」ということですが、先の質問で私が提示したものでは、ある画像を分割して、他の画像に隠していました。しかし、ここに書かれているのは、隠れた画像を復元した結果を表示している様に思います。もし、「分散はすでに済んでいる。2つを合わせて元の画像を復元することが目的だ」ということならば、2つの画像を単純に OR 演算するだけで良いはずです。そういうところまで含めて、自分が何をしなければならないか、理解していますか?


    Jitta@わんくま同盟

    2013年7月20日 11:31
  • 一応確認ですが、・・・これですか?

    秘密分散法 ... ( K , N )閾値法などの概要など
    視覚復号型秘密分散法 ... たぶん最終目標はこれの白黒版のことかなと)

    計算後にひっくり返すなりなんなりすればどうとでもできるでしょうが、単純に組むなら合成時は論理積が楽そうですね。 ( 結果= A & B )
    私自身の事情で色々とやることがあるのもあって、端から端まで読んで意味を含んでの検証はしていません(とくに肝心のループ内が成立してないので、意図的に思考停止しています)が、ざっと見では

    1.ウインドウプロシージャでいきなりデフォルトプロシージャの戻り値を返してるのでそれ以下が実行されない予定になってます。

    LRESULT CALLBACK WndProc(HWND hWnd,UINT nsg, WPARAM wp,LPARAM lp)
    {
    return DefWindowProc(hWnd, nsg, wp, lp);



    2.for文の中がカオスです。(ifで、比較しようとしているのだとおもいますが代入後の評価になっていますし、評価後が謎です。)

      if(c[i][j]=0)
    
    a1[m][n]);           d[i*3][j*3+n]=(char)((int)c[i][j]
         else
    b1[m][n]);           d[i*3][j*3+n]=(char)((int)c[i][j]
    
         if(d[i*3][j*3+n]=1)



    3.第2引数がnsgですが、下の方ではmsgとして使おうとしています。

    LRESULT CALLBACK WndProc(HWND hWnd,UINT nsg, WPARAM wp,LPARAM lp) での
    switch(msg)
    や
    return DefWindowProc(hWnd,mes,wp,lp);

    4.コピペミスかもしれませんが、WndProc関数終了のための}がありません。

    5.int b なんちゃら の多数の配列がありますが、半角スペースは変数名の間に入れることはできません。

    あとは、C++というよりC onlyといっても差支えないかと思える状況ですが、char d[315][315];とか結構でかいのでローカル変数としてはお勧めできません。(他の配列とかも)
    適宜分解し、必要に応じて動的確保・あらかじめ計算、C++を使っていいならばせめてクラスに管理させた方が良いと思います。(言語仕様を理解して綺麗な設計ができさえすれば、あとで見る必要が生じたとき自分や受け継ぐ人が苦しむ量がすくなくて済みます。)


    • 編集済み mr.setup 2013年7月20日 13:44 追記や誤字修正
    • 回答の候補に設定 星 睦美 2013年7月23日 6:45
    2013年7月20日 13:41
  •  コードを、何とか動くようにすると、こんな画像が表示されるのだけど、本当にこれが欲しい結果のかな?

    C# だけど、コード。新規の windowsForm アプリケーションに、TextBox を1つ貼り付け。画像を書くのが面倒だったので、"■" を並べてみた。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication2
    {
    	public partial class Form1 : Form
    	{
    		private int[,] white = new int[,] { { 1, 0, 0, 1, 0, 0, 1, 0, 0 }, { 1, 0, 0, 1, 0, 0, 1, 0, 0 }, { 1, 0, 0, 1, 0, 0, 1, 0, 0 } };
    		private int[,] black = new int[,] { { 1, 0, 0, 1, 0, 0, 1, 0, 0 }, { 0, 1, 0, 0, 1, 0, 0, 1, 0 }, { 0, 0, 1, 0, 0, 1, 0, 0, 1 } };
    		private int[,] source = new int[,] {
    			{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    			{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}, 
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    			{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    			{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
    		};
    
    		public Form1()
    		{
    			InitializeComponent();
    
    			this.textBox1.Font = new Font("MS ゴシック", 2f);
    			this.textBox1.Dock = DockStyle.Fill;
    			this.textBox1.Multiline = true;
    			this.textBox1.ReadOnly = true;
    			this.textBox1.ScrollBars = ScrollBars.Both;
    
    			Draw();
    		}
    
    		private void Draw()
    		{
    			int[,] dst = new int[21 * 3, 35 * 9];
    
    			for (int y = 0; y < 21; ++y)
    			{
    				for (int x = 0; x < 35; ++x)
    				{
    					for (int m = 0; m < 3; ++m)
    					{
    						for (int n = 0; n < 9; ++n)
    						{
    							if (source[y, x] == 0)
    							{
    								dst[y * 3 + m, x * 9 + n] = source[y, x] | white[m, n];
    							}
    							else
    							{
    								dst[y * 3 + m, x * 9 + n] = source[y, x] | black[m, n];
    							}
    						}
    					}
    				}
    			}
    
    			StringBuilder sb = new StringBuilder();
    			for (int y = 0; y < 21 * 3; ++y)
    			{
    				for (int x = 0; x < 35 * 9; ++x)
    				{
    					sb.Append(dst[y, x] == 0 ? " " : "■");
    				}
    				sb.Append(Environment.NewLine);
    			}
    
    			this.textBox1.Text = sb.ToString();
    		}
    	}
    }
    


    Jitta@わんくま同盟

    2013年7月22日 13:15
  •  コードを眺めていて、c 配列にうっすらと HIT が見えた。ああ、これが元の「画像」なのか、と気がついた。
     そうすると、後は推測を積み重ねていく。「白の基本行列」と「黒の基本行列」は、本当は、0~26を順番に使っていくのだと思う。でも、コード上、そんなことは表現されていないし、言葉でも説明されていないから省く。「ノイズ」が定期的なのは、0だけしか使っていないため、だろう。
     mr.setupさんが指摘されている、if 文の中は、まぁ、0との比較だろうとわかる。
     その判定文の中は、わからない。が、「白の基本行列」「黒の基本行列」という言葉(コメント、ではない)と、c がオリジナル画像だという推測から、オリジナルの画素が白だったとき、黒だったとき、使用する計算式だろうと推測。以前参照したページに、「画像を重ねたときに黒いところが消せないのでコントラストが低くなる」というような言葉があったので、OR 演算とした。
     m, n がなんなのか、わからない。これがあるために、1ドットを3×9ドットに拡大しているんじゃないか?と思う。おそらく、ノイズによって黒く潰れてしまうのを防ぐための措置じゃないかと思う。

     あとは、C++ でそのまま出したり、画像をそのまま出したら面白くないので、C# で文字を使って書いてみた。で、これって、先にも指摘しているけど、復元した画像ですよね。本当にこれが欲しいの?

     これと一つ上の投稿の対価を要求します。C++ のコードを完成させ、他の人にわかるようなコメントをつけて、公開してください。


    Jitta@わんくま同盟

    • 回答の候補に設定 星 睦美 2013年7月23日 6:46
    2013年7月22日 13:32
  • jitta@わんくま同盟さん、その他の皆さん

    プログラムコードのアドバイスいただきありがとうございます。

    C++でやっているので完成させたいと思っています。

    わんくま同盟さんのC++でのソースコードを是非見てみたいです。

    プログラム作成の参考になれればと思っています。

    よろしくお願いします。

    2013年7月24日 5:25
  • C++でやっていて、リアルに全然進まず、苦しい日々が続いています。誰か私に救いの手を差しのべてください。

    例えば、分散画像の行列はどうやって書いたらいいか?とか

    2013年7月24日 5:29
  • 「一度、こちらのドキュメントを読んでみてください」と紹介されたドキュメントを真剣に読むことですね。
    2013年7月24日 8:02
  •  あなたは、ここに、何を求めているのでしょうか。答えをぽんと提示して欲しい、というようにしか見えないのですが。それならば、「対価」ではなく、「報酬」を求めます。

     ところで、「分散画像の行列はどうやって書いたら良いか」ということですが、それは本で学んだのではないですか?画像を配列として表現することはできるし、実際内部的にはそうなのですが、最近の C++ では、画像クラスとして扱います。あなたが yahoo 等で提示しているコードは、C++ というよりも、C、Windows API で GUI を描く、今ではほとんど使う人もいないであろう手法です。

     いったい、あなたは、何をしたいのでしょう?自分が何をするべきなのか、正しく把握していますか?今までの投稿を見ると、まだ、自分がしなければならないことを把握できていないように思います。

     先に、プログラムはコンピュータに対する手紙である、と書きました。少し訂正します。コンピュータに対する命令書です。コンピュータがするべきことを並べ立てます。たとえば、人に、「アレを取ってきて」とお願いしたとします。お願いされた人は、あなたの状況を見て、「アレ」を推測し、取ってきてくれます。もしくは、「アレって何?」と、尋ねてきます。しかし、コンピュータは、そのような推測をしてくれません。「わかりません」と返すだけです。ですから、コンピュータに対する命令は、細かく行わなければなりません。「今いるところから北に2メートル進んで、机の上にある塩が入っている瓶を取り、ここへ戻ってこい」というように。これに照らし合わせると、あなたは、コンピュータにさせなければならないことを、どのくらい細かく知っていますか。どう言えばコンピュータに伝わるか。それを教えることはできます。しかし、どのようにコンピュータに何をさせるかというところは、あなたが考えなければならないことです。これが済んでいるなら、日本語をプログラム言語のように並べてみてください。それを C 言語へ変換することなら、やってくれる人もいるでしょう。それも考えてくれということなら、「分散画像の行列はどうやって書いたら良いか?」というのはそういっているように見えるのですが、それを考えてくれる人は、ここにはいないはずです。


    Jitta@わんくま同盟

    2013年7月24日 14:32
  • なかなか答えが見つからず、答えが欲しいと思った自分がいました。皆さん。不快な思いをしてしまい申し訳ありませんでした。
    2013年7月24日 16:52
  • 既にコメントしてある内容ですが読まれていないようなので今一度書かせていただきます。

    • 何の「協力」を求めればいいかご自身で把握できていますか?
    • 質問文が見当たりません。何を尋ねたいのでしょうか?
    • 他人に答えを求める行為そのものが間違っています。答えが見つかったとしてそれはあなたの成果なのですか?
    • 回答の候補に設定 佐祐理 2013年7月24日 22:51
    2013年7月24日 22:50
  • 今後も広く役立つアドバイスだと思いますので私のほうでAzulean さんと中澤@失業者 さんの返信に[回答としてマーク] しました。
    こちらのスレッドは回答を終了とさせていただきますが、
    今回のスレッドの返信を参考に、Visual C++ に関する質問がありましたらフォーラムに投稿いただければと思います。



    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年7月26日 2:32