在我的项目中,我必须以任何格式(* .png,* .jpg,* .bmp等)设置图像评级值,并返回该值。
我尝试使用PropertyItem
。它不起作用。
Image im = Image.FromFile("D:\\2.jpg");
int intValue = 3;
byte[] intBytes = BitConverter.GetBytes(intValue);
if (BitConverter.IsLittleEndian)Array.Reverse(intBytes);
byte[] result = intBytes;
PropertyItem prop = im.GetPropertyItem(18246);
prop.Value = result;
im.SetPropertyItem(prop);
有人这样做,如果是的话,谢谢?
答案 0 :(得分:1)
设置评级您必须设置两个值。 评分和评分百分比
这两个值彼此对应。因此,仅设置评级并不反映Windows中的评级星。 (事实上它非常棘手,因为你设置了值,你可以读它,但在Windows资源管理器中没有任何变化)。
class Program
{
static void Main(string[] args)
{
//0,1,2,3,4,5
SetRating(0);
SetRating(1);
SetRating(2);
SetRating(3);
SetRating(4);
SetRating(5);
}
private static void SetRating(short ratingValue)
{
short ratingPercentageValue = 0;
switch (ratingValue)
{
case 0: ratingPercentageValue = ratingValue; break;
case 1: ratingPercentageValue = ratingValue; break;
default: ratingPercentageValue = (short)((ratingValue - 1) * 25); break;
}
string SelectedImage = @"d:\Trash\phototemp\IMG_1200.JPG";
using (var imageTemp = System.Drawing.Image.FromFile(SelectedImage))
{
var rating = imageTemp.PropertyItems.FirstOrDefault(x => x.Id == 18246);
var ratingPercentage = imageTemp.PropertyItems.FirstOrDefault(x => x.Id == 18249);
rating.Value = BitConverter.GetBytes(ratingValue);
rating.Len= rating.Value.Length;
ratingPercentage.Value = BitConverter.GetBytes(ratingPercentageValue);
ratingPercentage.Len = ratingPercentage.Value.Length;
imageTemp.SetPropertyItem(rating);
imageTemp.SetPropertyItem(ratingPercentage);
imageTemp.Save(SelectedImage + "new" + ratingValue +".jpg");
}
}
}
答案 1 :(得分:-1)
解决方案不是最佳(和hackish),但最简单的方法是:
1)使用硬盘上的图像。任何形象。只需手动评级,以便图像具有此属性。
2)此图像将作为您的虚拟图像",以便您可以加载它以便在其上调用getPropertyItem(),以获取属性。
3)获得PropertyItem后,只需更改其值,并在实际图像上使用SetPropertyItem。
string dummyFileName = @"C:\Users\<youruser>\Pictures\dummy.jpg";
string realFileName = @"C:\Users\<youruser>\Pictures\real.jpg";
string realFileNameOutput = @"C:\Users\<youruser\Pictures\real_rated.jpg";
Image dummyFile = Image.FromFile(dummyFileName);
var propertyItem = dummyFile.GetPropertyItem(18246);
Image realImage = Image.FromFile(realFileName);
realImage.SetPropertyItem(propertyItem);
realImage.Save(realFileNameOutput);