C# 在Windows Server 2003 Web Edition上运行的服务中设置BitmapMetadata.Title会引发NotSupportedException

C# 在Windows Server 2003 Web Edition上运行的服务中设置BitmapMetadata.Title会引发NotSupportedException,c#,wcf,bitmap,metadata,windows-server-2003,C#,Wcf,Bitmap,Metadata,Windows Server 2003,因此,我使用此方法设置一些基本元数据标记,这些标记最终将添加到我的图像中: BitmapMetadata metaData = new BitmapMetadata("jpg"); foreach (var t in tags) { try { switch (t.Key) { case "Auth

因此,我使用此方法设置一些基本元数据标记,这些标记最终将添加到我的图像中:

        BitmapMetadata metaData = new BitmapMetadata("jpg");
        foreach (var t in tags)
        {
            try
            {
                switch (t.Key)
                {
                    case "Author":
                        metaData.Author = new System.Collections.ObjectModel.ReadOnlyCollection<string>(new string[] { t.Value });
                        break;

                    case "Rating":
                        int rating = 0;
                        if (int.TryParse(t.Value, out rating))
                        {
                            metaData.Rating = rating;
                        }
                        break;

                    case "Subject":
                        metaData.Subject = t.Value;
                        break;

                    case "Title":
                        metaData.Title = t.Value;
                        break;

                    case "Comment":
                        metaData.Comment = t.Value;
                        break;

                    default:
                        keywords.Add(string.Format("{0}:{1}", t.Key, t.Value));
                        break;
                }
            }
            catch (Exception ex)
            {
                //Do some logging
            }
        }
BitmapMetadata元数据=新的BitmapMetadata(“jpg”);
foreach(标签中的var t)
{
尝试
{
开关(t键)
{
案例“作者”:
metaData.Author=new System.Collections.ObjectModel.ReadOnlyCollection(新字符串[]{t.Value});
打破
案例“评级”:
内部评级=0;
if(内锥巴色(t值,外额定值))
{
元数据。评级=评级;
}
打破
案例“主题”:
metaData.Subject=t.Value;
打破
案例“标题”:
metaData.Title=t.Value;
打破
案例“评论”:
metaData.Comment=t.Value;
打破
违约:
关键词.Add(string.Format(“{0}:{1}”,t.Key,t.Value));
打破
}
}
捕获(例外情况除外)
{
//做些日志记录
}
}
我不断地发现错误:

System.NotSupportedException:没有适合的成像组件 找到完成此操作。--> System.Runtime.InteropServices.ComeException:来自HRESULT的异常: 0x88982F50---内部异常堆栈跟踪结束---\at System.Windows.Media.Imaging.BitmapMetadata.SetQuery(字符串查询, 对象值)\at System.Windows.Media.Imaging.BitmapMetadata.set_Title(字符串值)


在Windows 8.1上作为本地主机运行,这很好。一旦我将服务部署到WindowsServer2003WebEdition,它就会抛出显示的错误。发生了什么事?

解决方法是显式地使用SetQuery查询元数据。。。 例如:

BitmapMetadata jpgData = new BitmapMetadata("jpg");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/object name", "Test Title");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/keywords", "Test Tag");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/date created", "20090512");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/time created", "115300-0800");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/caption", "Test Comment");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/by-line", "Test Author");
jpgData.SetQuery("/app13/irb/8bimiptc/iptc/copyright notice", "Copyright 2009");
从评论


这是因为windows server 2003中使用的WIC与windows 7/8不同,无法更新。因此metadata.Title等抛出notfoundexception

可能您缺少JPEG编码器。这通常位于System.Drawing.dll的命名空间System.Drawing.Imaging中。尝试执行“ImageCodecInfo[]encoderaray=ImageCodecInfo.GetImageEncoders();”,并检查返回的数组中是否至少有一个结果。我已运行该方法并打印了编解码器名称,结果是:内置BMP编解码器、内置GIF编解码器、内置TIFF编解码器、内置PNG编解码器,我猜我缺少jpg编码器了?如何在Windows 2003服务器上安装jpg编码器?是的。不幸的是,我对这一具体情况一无所知。您可以尝试安装此:(但如果它导致问题,请不要责怪我。:-)您也可以在Windows 8.1系统上运行该语句,以查看预期结果。是的,在Windows 8.1上,我运行了相同的语句,并获得了内置的JPG编码器。我可能会尝试安装并更新我的答案