本文告訴大家如何在 UWP 中,保存圖片的時候,寫入 Exif 資訊,也就是如照片的 相機型號 制造商 光圈值等資訊的寫入
在 UWP 中,保存圖片或照片需要用到圖片編碼器,在使用編碼器寫入前可以設定編碼器寫入圖片的屬性,此時就可以包含了 Exif 資訊,關于啥是 Exif 資訊,還請自行百度
不同的圖片格式可以支持的 Exif 資訊范圍不相同,咱以下使用 jpg 圖片作為例子,如果大家切換為其他圖片格式,還請自行測驗一下
在創建編碼器可以在建構式傳入引數,通過引數設定一些 Exif 資訊,如質量資訊,下面代碼在創建時傳入質量資訊
BitmapPropertySet propertySet = new BitmapPropertySet();
BitmapTypedValue qualityValue = https://www.cnblogs.com/lindexi/p/new BitmapTypedValue(0.77, PropertyType.Single);
propertySet.Add("ImageQuality", qualityValue);
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, pngStream.AsRandomAccessStream(), propertySet);
上面代碼的 pngStream 是一個檔案,用于寫入圖片,這部分代碼不是本文重點,如果要獲取全部的代碼,還請到本文最后獲取代碼
在創建完成編碼器之后,依然可以再次設定圖片資訊,通過呼叫 encoder.BitmapProperties.SetPropertiesAsync 方法進行設定
如以下代碼,設定作者資訊
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, pngStream.AsRandomAccessStream(), propertySet);
propertySet = new BitmapPropertySet();
// 作者
propertySet.Add("System.Author", new BitmapTypedValue("lindexi", PropertyType.String));
await encoder.BitmapProperties.SetPropertiesAsync(propertySet);
寫入之后,可以右擊圖片檔案的屬性,進入詳細資訊,在詳細資訊里面可以看到圖片的資訊
以上有一個問題是,能寫入屬性有哪些,寫入的型別是什么?這些可以從 官方檔案 獲取
如官方檔案里面說寫入相機型號的描述如下
propertyDescription
name = System.Photo.CameraManufacturer
shellPKey = PKEY_Photo_CameraManufacturer
formatID = 14B81DA1-0135-4D31-96D9-6CBFC9671A99
propID = 271
SearchInfo
InInvertedIndex = true
IsColumn = true
typeInfo
type = String
以上的含義就是寫入的 Key 是 System.Photo.CameraManufacturer 要求傳入的型別是 PropertyType.String 字串,根據這個即可了解如何寫以上的代碼,如寫入相機型號的描述等代碼如下
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, pngStream.AsRandomAccessStream(), propertySet);
// https://docs.microsoft.com/en-us/windows/win32/properties/windows-properties-system?WT.mc_id=WD-MVP-5003260
propertySet = new BitmapPropertySet();
// 作者
propertySet.Add("System.Author", new BitmapTypedValue("lindexi", PropertyType.String));
// 相機型號
propertySet.Add("System.Photo.CameraModel", new BitmapTypedValue("lindexi", PropertyType.String));
// 制造商
propertySet.Add("System.Photo.CameraManufacturer", new BitmapTypedValue("lindexi manufacturer", PropertyType.String));
// 光圈值 System.Photo.FNumberNumerator/System.Photo.FNumberDenominator
propertySet.Add("System.Photo.FNumberNumerator", new BitmapTypedValue(1, PropertyType.UInt32));
propertySet.Add("System.Photo.FNumberDenominator", new BitmapTypedValue(10, PropertyType.UInt32));
await encoder.BitmapProperties.SetPropertiesAsync(propertySet);
下面代碼是在加載頁面,然后進行截圖,保存截圖到本地檔案的代碼
public MainPage()
{
this.InitializeComponent();
Loaded += MainPage_Loaded;
}
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
await Task.Delay(TimeSpan.FromSeconds(1));
var renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(Grid);
var pngFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(Path.GetRandomFileName() + ".jpg");
using (var pngStream = await pngFile.OpenStreamForWriteAsync())
{
BitmapPropertySet propertySet = new BitmapPropertySet();
BitmapTypedValue qualityValue = https://www.cnblogs.com/lindexi/p/new BitmapTypedValue(0.77, PropertyType.Single);
propertySet.Add("ImageQuality", qualityValue);
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, pngStream.AsRandomAccessStream(), propertySet);
// https://docs.microsoft.com/en-us/windows/win32/properties/windows-properties-system?WT.mc_id=WD-MVP-5003260
propertySet = new BitmapPropertySet();
// 作者
propertySet.Add("System.Author", new BitmapTypedValue("lindexi", PropertyType.String));
// 相機型號
propertySet.Add("System.Photo.CameraModel", new BitmapTypedValue("lindexi", PropertyType.String));
// 制造商
propertySet.Add("System.Photo.CameraManufacturer", new BitmapTypedValue("lindexi manufacturer", PropertyType.String));
// 光圈值 System.Photo.FNumberNumerator/System.Photo.FNumberDenominator
propertySet.Add("System.Photo.FNumberNumerator", new BitmapTypedValue(1, PropertyType.UInt32));
propertySet.Add("System.Photo.FNumberDenominator", new BitmapTypedValue(10, PropertyType.UInt32));
await encoder.BitmapProperties.SetPropertiesAsync(propertySet);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
var softwareBitmap = SoftwareBitmap.CreateCopyFromBuffer(pixelBuffer, BitmapPixelFormat.Bgra8, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);
encoder.SetSoftwareBitmap(softwareBitmap);
await encoder.FlushAsync();
softwareBitmap.Dispose();
}
await Launcher.LaunchFolderAsync(ApplicationData.Current.TemporaryFolder);
}
本文代碼可以到 寫入圖片Exif資訊.7z-CSDN 下載
本文上面代碼放在 github 和 gitee 歡迎訪問
可以通過如下方式獲取本文的源代碼,先創建一個空檔案夾,接著使用命令列 cd 命令進入此空檔案夾,在命令列里面輸入以下代碼,即可獲取到本文的代碼
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin acdca3ea99682d6549cf2622fb96685531ab9ded
以上使用的是 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
獲取代碼之后,進入 KechinabeleenalLechefahar 檔案夾
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/289072.html
標籤:UWP
上一篇:UWP 寫入圖片 Exif 資訊
