1

我在 ASP.NET 版本 2 中使用 C#。我正在尝试打开一个图像文件,读取(并更改)XMP 标头,然后再次将其关闭。我无法升级 ASP,所以 WIC 已经失效,我只是不知道如何让它工作。

这是我到目前为止所拥有的:

Bitmap bmp = new Bitmap(Server.MapPath(imageFile));

MemoryStream ms = new MemoryStream();

StreamReader sr = new StreamReader(Server.MapPath(imageFile));

*[stuff with find and replace here]*

byte[] data = ToByteArray(sr.ReadToEnd());

ms = new MemoryStream(data);

originalImage = System.Drawing.Image.FromStream(ms);

有什么建议么?

4

3 回答 3

1

这种事怎么办?

byte[] data = File.ReadAllBytes(path);
... find & replace bit here ...
File.WriteAllBytes(path, data);

另外,我真的建议不要在 asp.net 进程中使用 System.Bitmap,因为它会泄漏内存并且会时不时地崩溃/随机失败(甚至 MS 也承认这一点)

下面是 MS 关于 System.Drawing.Bitmap 不稳定的原因:

http://msdn.microsoft.com/en-us/library/system.drawing.aspx

“警告:System.Drawing 命名空间中的类不支持在 Windows 或 ASP.NET 服务中使用。尝试从这些应用程序类型之一中使用这些类可能会产生意外问题,例如降低服务性能和运行时间例外。”

于 2009-05-27T06:40:29.520 回答
1

XMP 规范 2012 的第 1 部分,第 10 页专门讨论了如何在不需要了解周围格式的情况下就地编辑文件(尽管他们确实建议将此作为最后的手段)。嵌入的 XMP 数据包如下所示:

<?xpacket begin="■" id="W5M0MpCehiHzreSzNTczkc9d"?>
    ... the serialized XMP as described above: ...
    <x:xmpmeta xmlns:x="adobe:ns:meta/">
    <rdf:RDF xmlns:rdf= ...>
        ...
    </rdf:RDF>
    </x:xmpmeta>
    ... XML whitespace as padding ...
<?xpacket end="w"?>

在此示例中,“■”表示用作字节顺序标记的 Unicode“零宽度不间断空格字符”(U+FEFF)。

(XMP Spec 2010, Part 3, Page 12) 还提供了在扫描字节时要查找的特定字节模式(UTF-8、UTF16、大/小端)。这将补充克里斯关于将文件作为巨型字节流读取的答案。

于 2010-01-19T22:20:20.110 回答
0

您可以使用以下函数来读取/写入二进制数据:

    public byte[] GetBinaryData(string path, int bufferSize)
    {
        MemoryStream ms = new MemoryStream();
        using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
        {
            int bytesRead;
            byte[] buffer = new byte[bufferSize];
            while((bytesRead = fs.Read(buffer,0,bufferSize))>0)
            {
                ms.Write(buffer,0,bytesRead);
            }
        }
        return(ms.ToArray());
    }

    public void SaveBinaryData(string path, byte[] data, int bufferSize)
    {
        using (FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write))
        {
            int totalBytesSaved = 0;
            while (totalBytesSaved<data.Length)
            {
                int remainingBytes = Math.Min(bufferSize, data.Length - totalBytesSaved);
                fs.Write(data, totalBytesSaved, remainingBytes);
                totalBytesSaved += remainingBytes;
            }
        }
    }

但是,将整个图像加载到内存中会占用大量 RAM。我对 XMP 标头了解不多,但如果可能的话,您应该:

  • 仅加载内存中的标头
  • 操作内存中的标头
  • 将标头写入新文件
  • 从原始文件中复制剩余数据
于 2009-05-26T22:20:10.470 回答