-2

C# を使用して、多数の小さな画像を 1 つの (テキスト) ファイルに保存する方法を探しています。

ピクセル データ (rgb 値) を取得し、それを文字列としてファイルに書き込む 2D ループ (2 つのネストされた for ループ) を持つことを考えていました。

これを行うためのよりエレガントな方法はありますか? 代わりに16進数の色またはuintとして保存しますか?( #FF00FF / 0xFF00FF )

後で読みやすいように、最終的なテキスト ファイルを構成するにはどうすればよいでしょうか (カスタム アルゴリズムを使用してテキスト ファイルを暗号化したい)。

4

2 に答える 2

3

画像をバイナリとして開き、Base64 に変換してから、文字列としてテキスト ファイルに保存できます。

    public static string CreateFileStringFromPath(string tempPath)
    {
        //We Convert The Image into a BASE64 String and so store it as text
        //First we add a Stream to the File
        FileStream tempStream = new FileStream(tempPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
        try
        {
            //Then we write the Stream to a Byte Array
            byte[] tempByteArray = ReadStreamFully(tempStream);
            tempStream.Dispose();
        }
        catch(Exception)
        {
            tempStream.Dispose();
            return null;
        }

        //Then we Convert the Byte Array to a Base64 String and return it
        return Convert.ToBase64String(tempByteArray);
    }

    public static byte[] ReadStreamFully(Stream tempFileStreamInput)
    {
        //We Create a MemoryStream which we can form into an Byte Array
        using(MemoryStream tempMemoryStream = new MemoryStream())
        {
            tempFileStreamInput.CopyTo(tempMemoryStream);
            return tempMemoryStream.ToArray();
        }
    }

文字列ができたので、それらをディスクに保存したいので、それらを保存する方法のみが必要です

編集1:リクエストに応じて、ピクセルを保存する方法を次に示します

private Color[,] GetPixel_Example(Bitmap myBitmap)
{
Color[,] tempColor = new Color[myBitmap.width,myBitmap.height]
for(int i = 0; i < myBitmap.height;i++)
  for(int j = 0; j < myBitmap.width;j++)
    // Get the color of a pixel within myBitmap.
    Color pixelColor = myBitmap.GetPixel(j,i);
    //And save it in the array
    tempColor[j,i] = pixelColor;
return tempColor;
}

この例は当然ビットマップで動作し、すべてのピクセルがカラーとして保存される 2 次元配列を返します。これで、RGB や HEX などを抽出できます。この例を System.Media.Images または単なるファイルに簡単に変更できます。ピクチャをビットマップにする方法がわからない場合は、Bitmap.LoadFromFile(); のようなものがあるはずです。

于 2013-07-10T10:12:21.673 に答える
0

複数の画像があるので。xmlなどの構造化ファイルを実行します

<Images>
 <Image name = "somename.someimageextension"
 <Content></Content>
</Image>
</Images>

コンテンツを取得するには、画像を(ディスクから?)ストリームとして取得し、次のようなものでbase64に変換します

string contentAsBase64 = Convert.ToBase64String(imageAsStream.ToArray());

ドキュメント全体を暗号化/署名します。

于 2013-07-10T10:29:52.083 に答える