概要:概要
最近、リソースマネージャのバックグラウンド機能を行うとき、DLLに情報を渡す必要があります。
主に、画像の適合性、透明度などを含むいくつかの比較的単純なパラメータを渡すことです。コミュニケーションの様々な方法がありますが、結局のところ、練習の機能であり、以前に使用したことのない方法を見つけたいです。
前回の記事では、画像ファイルにデータを埋め込む2つの方法を紹介しました。
https://www.cnblogs.com/zhaotianff/p/17222056.html
そこで、ここでも画像ファイルに直接データを書き込み、DLLで読み込みたいと思います。
インターネットで調べたところ、JPGファイルに自分のデータを書き込む簡単な方法があります。
また、理論は無制限のサイズのデータを書き込むことができます。
余談ですが、ファイルの形式に関係なく、標準的なフォーマットがあります。一般的には、ファイルヘッダ、ファイル本体などが含まれ、ファイル構造に精通した後、元のファイル構造を破壊することなく、ファイルヘッダに独自のデータを書き込みたい場合は、理論的には実現可能です。
しかし、プロセスには時間がかかります。
我这里是直接使用了NVISO Labs 现有的方式,给有需要的小伙伴做一个分享。
実装の原理
まず、通常のJPGファイルを16進エディタで開きます。

最初の2バイトは **FF D 8 ** です。
FF D8 => ** これはJPEGデータストリームの開始を示すフラグである **
JPEGデータストリームの開始タグを見つけたら、その後ろに“コメント”タグを挿入します。
FF FE =>** これは“コメント”マークであり、JPEGデコーダでも無視されます。これらのマーカーは、データを挿入し、有効な画像を保持する方法です **
FF FEの後に2バイトが続き、コメントの内容のサイズを表します。
例:サンプル
JPGファイルに HelloWorld を書き込むとします。“HelloWorld”は10バイトなので、FF FE の後に書きます。
00 0A(10バイト)48 65 6C 6C 6F 57 6F 72 6C 64
ここでは合計14バイトで、**FF FE 2バイト *** のヘッダ ** 00 0 A 2バイト *** のサイズと **10バイト ** の内容が含まれています。
そこで、16進エディタを使用して **FF D 8 ** の後に14バイトを挿入します。


次に、以下のようにデータを入力する。

保存後もJPGファイルは正常に開く

** コードの実装 **
C#を例にとると、他の言語でも同じように実装されていますが、ここでは不透明度とstrechデータを書き込みます。
private void WriteImageInfoToFile(string filePath,double opacity,int stretch)
{
//读取文件数据
var buffer = System.IO.File.ReadAllBytes(filePath);
//判断是否是JPG文件
if (buffer[0] == 0xFF && buffer[1] == 0xD8)
{
//将原始数据扩容6个字节
var newBuffer = new byte[buffer.Length + 6];
//拷贝JPG文件开始标记 FF D8
Array.Copy(buffer, 0, newBuffer, 0, 2);
//设置数据
//注释标记
newBuffer[2] = 0xFF;
newBuffer[3] = 0xFE;
//大小 0x02
newBuffer[4] = 0;
newBuffer[5] = 0x02;
//数据
newBuffer[6] = (byte)nOpacity;
newBuffer[7] = (byte)stretch;
//将原图片剩下的数据拷贝到新buffer中
Array.Copy(buffer, 2, newBuffer, 7, buffer.Length - 2);
//写入文件
System.IO.File.WriteAllBytes(filePath, newBuffer);
}
}
読むときは、同じルールで読むだけです。
リファレンス·リソース
https://blog.nviso.eu/2020/07/13/how-to-embed-secret-data-in-jpeg-files/