Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言修改XMP数据#_C#_Asp.net_Image Processing_Xmp - Fatal编程技术网

C# 用C语言修改XMP数据#

C# 用C语言修改XMP数据#,c#,asp.net,image-processing,xmp,C#,Asp.net,Image Processing,Xmp,我正在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))

我正在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);

有什么建议吗?

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

    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;
            }
        }
    }
公共字节[]GetBinaryData(字符串路径,int-bufferSize) { MemoryStream ms=新的MemoryStream(); 使用(FileStream fs=File.Open(path,FileMode.Open,FileAccess.Read)) { int字节读取; 字节[]缓冲区=新字节[bufferSize]; 而((bytesRead=fs.Read(buffer,0,bufferSize))>0) { ms.Write(缓冲区,0,字节读取); } } 返回(ToArray女士()); } public void SaveBinaryData(字符串路径,字节[]数据,int-bufferSize) { 使用(FileStream fs=File.Open(路径、FileMode.Create、FileAccess.Write)) { int totalbytesaved=0;
而(TotalByTesserved这类事情怎么样

byte[] data = File.ReadAllBytes(path);
... find & replace bit here ...
File.WriteAllBytes(path, data);
另外,我真的建议不要在asp.net进程中使用System.Bitmap,因为它会泄漏内存,并且会时不时地崩溃/随机失败(即使MS也承认这一点)

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

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

专门讨论了如何在不需要了解周围格式的情况下就地编辑文件(尽管他们建议将此作为最后手段)。嵌入式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"?>

…如上所述的序列化XMP:。。。
...
…XML空白作为填充。。。
在这个例子中,'■’ 代表 Unicode“零宽度非中断空间” 字符“(U+FEFF)用作 字节顺序标记


(XMP Spec 2010,第3部分,第12页)还提供了特定的字节模式(UTF-8、UTF16、大/小端)在扫描字节时查找。这将补充Chris关于将文件作为一个大字节流读取的回答。

对于您试图实现的目标,我并不认为您需要将其作为位图读取,您听起来更像是只想处理原始字节,对吗?