-2

我正在寻找一种使用 C# 将一堆小图像保存到一个(文本)文件中的方法。

我正在考虑使用一个 2D 循环(2 个嵌套的 for 循环)来获取像素数据(rgb 值)并将其作为字符串写入文件。

有没有更优雅的方法来做到这一点?也许保存为十六进制颜色或 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();
        }
    }

现在我们有了一个字符串,我们只需要一种方法来存储它们,因为您想将它们存储在磁盘上考虑 XML(可能还有 XSD 样式表)或将它们插入到任何其他可序列化的结构中,如 JSON

编辑 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;
}

这个例子自然只适用于位图并返回一个二维数组,其中所有像素都保存为颜色,现在可以提取 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 回答