【问题标题】:Save Bitmap to same file it was loaded from将位图保存到加载它的同一个文件
【发布时间】:2015-07-08 15:14:17
【问题描述】:

我正在尝试将Bitmap 保存到我从中加载它的同一文件中。但是我无法这样做。我知道 .save() 函数的文档说“不要将图像保存到用于构造图像的同一流中。这样做可能会损坏流”,并认为这是我的问题的原因。 例如,如果我加载图像“a.jpg”,我无法将修改后的文件保存回“a.jpg”,我必须更改文件名。

这是我加载图片的代码:

std::string fullPath = imgFolderPath + "\\" + imageFileNames[i];
std::wstring wstr(fullPath.begin(), fullPath.end());
Bitmap* bitmap = new Bitmap(wstr.c_str());

我保存图像的代码是:

bitmap->Save(wstr.c_str(), &clsid, NULL);

当文件名不同时,这可以正常工作。有没有办法可以写入同一张图片?我宁愿“更新”图像,也不愿完全创建一个新图像。

【问题讨论】:

    标签: c++ .net windows bitmap


    【解决方案1】:

    只要将图像存储到缓冲区中,为什么不直接删除图像 ex.'system("rm foo.png")' 然后写入?

    【讨论】:

    • 你的意思是先存到一个临时文件中,等原件关闭后再写入?我试图避免这种情况,因为它们通常一批大约有 1000 张左右的图像。
    • 你的缓冲区是可变的*位图。 ^^
    • 文档说“文件保持锁定直到位图被释放”,所以我认为在缓冲区存在时我真的不能对原始文件做任何事情......
    【解决方案2】:

    你不能关闭现有的位图流,然后打开一个新的以相同的文件名写入吗?这应该会覆盖原始图像。

    【讨论】:

    • 根据文档“在处理位图之前,文件保持锁定状态。”...
    • 您能否向我们指出包含文本“文件保持锁定直到位图被释放。”的文档?
    【解决方案3】:

    我在 GDI+ 文档的 Community Additions 部分中从 jlpilkin 看到的建议建议不要直接从文件创建位图。相反,将文件读入内存缓冲区,创建内存流,然后从内存流创建位图。一旦Bitmap被创建,你就可以释放内存流和内存缓冲区。现在您有了一个未打开原始文件的位图。

    然后我会将修改后的位图保存为一个临时名称,并使用 ReplaceFile 将其自动移动到原始文件名,同时保留原始文件的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2016-03-24
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多