【问题标题】:Saving bitmap data as plain text将位图数据保存为纯文本
【发布时间】:2013-07-10 10:08:58
【问题描述】:

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

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

还有更优雅的方法吗?也许保存为十六进制颜色或 uint 代替? (#FF00FF / 0xFF00FF)

我如何构建最终的文本文件,以便之后阅读更好(我想使用自定义算法加密文本文件)。

【问题讨论】:

  • 我会使用 Base64,类似于使用 data URI scheme 将图像嵌入 HTML 页面所做的工作。
  • 你选择什么全看你想要什么。我没有看到您在这里遇到实际问题,所以我投票关闭它。您需要确定自己的需求是什么,并据此做出决定

标签: c# .net bitmap text-files


【解决方案1】:

您可以将图片打开为二进制并将其转换为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();

【讨论】:

  • 这是如何获得赞成票的?这只是一个关于做什么的建议,没有代码可以显示如何去做。另外,我认为 Base64 不符合“好读”的条件。我认为这充其量应该是一条评论
  • @musefan 我认为他要求一种方法来做到这一点,而不是一步一步的建议或代码,就像你说的那样是一个建议。如果你愿意,我可以在这里提供完整的代码。 :)
  • 现在比我的更全面。 :p
  • 我的图像非常小(大多数情况下为 32x32 像素)我想我只想将像素颜色值(作为 RGB 或十六进制)以字符串格式存储在二维数组中。
  • @Ace,如果要存储像素颜色,为什么要使用字符串?您可以将 RGB 存储为无符号字节(数字从 0 到 255,就像 rgb)。这样你的文件会非常小,字符串会更大。
【解决方案2】:

因为您有多个图像。做一个结构化文件,比如xml 例如

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

要获取内容,请将您的图像(从磁盘?)作为流,将其转换为 base64,例如

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

加密/签署整个文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多