質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

437閲覧

メモリ上にあるpngファイルからGdiplus::Bitmapを作る

kbys32

総合スコア55

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2023/08/11 01:44

編集2023/08/11 01:45

実現したいこと

メモリ上にあるpngファイルから、Gdiplus::Bitmapを作りたいです。

前提

pngファイルを暗号化してbinファイルの書き出された状態から、これを復号化して
pngファイルに破損なく書き出すことはできます。

発生している問題・エラーメッセージ

復号化後、ファイルに書き出さずGdiplus::Bitmap化してウインドウに表示
させる方法が分からず、困っています。
どのような方法がありますか。

該当のソースコード

復号化の方法は、下記の通りです。

C++

1FileDec::FileDec(const char * FilePath) 2{ 3 if (exist_file(FilePath)) 4 { 5 ErrorCode = 0; 6 7 } 8 else 9 { 10 ErrorCode = 1; 11 return; 12 } 13 14//binファイルの読み込み 15 std::ifstream ifs(FilePath, std::ios::in | std::ios::binary); 16 17 if (!ifs) 18 { 19 ErrorCode = 2; 20 return ; 21 } 22 23 24 // ファイルの中身すべてを std::vector<char> に読み込む 25 std::istreambuf_iterator<char> it_ifs_begin(ifs); 26 std::istreambuf_iterator<char> it_ifs_end{}; 27 std::vector<char> input_data(it_ifs_begin, it_ifs_end); 28 if (ifs.fail()) { 29 ErrorCode = 3; 30 } 31 32 33 ifs.close(); 34 35//復号化キー取得 36 const char* key = keyGet(FilePath); 37 38//復号化開始 39 long counter = 0; 40 std::vector<char> result(input_data.size()); 41 for (char var : input_data) 42 { 43 result[counter] = input_data[counter] ^ key[counter%1024]; 44 counter++; 45 } 46 47}

このresultに復号化されたpngファイルがあります。

試したこと

pngファイルをストレージに書き出し、すぐにGdiplus::Bitmap::FromFileで
読み込んでpngを削除することも考えましたが、セキュリティ上よろしくないと判断しました。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.4.4使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メモリストリームとして、ファイルっぽく扱えるかと思われますが、どうでしょう?
http://yamatyuu.net/computer/program/vc2013/jpgviewmem/index.html

投稿2023/08/11 04:47

setoppu

総合スコア313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kbys32

2023/08/11 05:32

ありがとうございます。試してみます。
kbys32

2023/08/11 07:19

下記の内容でうまくいきました。ご協力をありがとうございました。 ```C++ std::vector<char> v(data); std::string s(v.begin(), v.end()); hBuf = ::GlobalAlloc(GMEM_MOVEABLE, sizeof(char) * s.length()); if (!hBuf) return 0; hMem = (char*) ::GlobalLock(hBuf); if (hMem == 0) { return 0; } strcpy(hMem, s.c_str()); if (CreateStreamOnHGlobal(hBuf, FALSE, &pIStream) != S_OK) { MessageBox(0, _TEXT("CreateStreamOnHGlobal APIでのメモリストリームの作成に失敗しました"), _TEXT("エラー"), MB_OK); GlobalFree(hBuf); PostQuitMessage(0); } pBitmap = Gdiplus::Bitmap::FromStream(pIStream); ::GlobalUnlock(hMem); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問