Metadata Gambar

Artikel ini menunjukkan cara membaca dan menulis properti metadata gambar dan cara membuat geotag file menggunakan kelas utilitas GeotagHelper .

Properti gambar

Properti StorageFile.Properties mengembalikan objek StorageItemContentProperties yang menyediakan akses ke informasi terkait konten tentang file tersebut. Dapatkan properti khusus gambar dengan memanggil GetImagePropertiesAsync. Objek ImageProperties yang dikembalikan mengekspos anggota yang berisi bidang metadata gambar dasar, seperti judul gambar dan tanggal pengambilan.

private async void GetImageProperties(StorageFile imageFile)
{
    ImageProperties props = await imageFile.Properties.GetImagePropertiesAsync();

    string title = props.Title;
    if (title == null)
    {
        // Format does not support, or image does not contain Title property
    }

    DateTimeOffset date = props.DateTaken;
    if (date == null)
    {
        // Format does not support, or image does not contain DateTaken property
    }
}

Untuk mengakses sekumpulan metadata file yang lebih besar, gunakan Sistem Properti Windows, sekumpulan properti metadata file yang dapat diambil dengan pengidentifikasi string unik. Buat daftar string dan tambahkan pengidentifikasi untuk setiap properti yang ingin Anda ambil. Metode ImageProperties.RetrievePropertiesAsync mengambil daftar string ini dan mengembalikan kamus pasangan kunci/nilai di mana kuncinya adalah pengidentifikasi properti dan nilainya adalah nilai properti.

ImageProperties props = await imageFile.Properties.GetImagePropertiesAsync();

var requests = new System.Collections.Generic.List<string>();
requests.Add("System.Photo.Orientation");
requests.Add("System.Photo.Aperture");

IDictionary<string, object> retrievedProps = await props.RetrievePropertiesAsync(requests);

ushort orientation;
if (retrievedProps.ContainsKey("System.Photo.Orientation"))
{
    orientation = (ushort)retrievedProps["System.Photo.Orientation"];
}

double aperture;
if (retrievedProps.ContainsKey("System.Photo.Aperture"))
{
    aperture = (double)retrievedProps["System.Photo.Aperture"];
}
  • Untuk daftar lengkap Properti Windows, termasuk pengidentifikasi dan jenis untuk setiap properti, lihat Properti Windows.

  • Beberapa properti hanya didukung untuk kontainer file dan codec gambar tertentu. Untuk daftar metadata gambar yang didukung untuk setiap jenis gambar, lihat Kebijakan Metadata Foto.

  • Karena properti yang tidak didukung dapat mengembalikan nilai null saat diambil, selalu periksa null sebelum menggunakan nilai metadata yang dikembalikan.

Pembantu geotag

GeotagHelper adalah kelas utilitas yang memudahkan untuk menandai gambar dengan data geografis menggunakan API Windows.Devices.Geolocation secara langsung, tanpa harus mengurai atau membuat format metadata secara manual.

Jika Anda sudah memiliki objek Geopoint yang mewakili lokasi yang ingin Anda tandai dalam gambar, baik dari penggunaan API geolokasi sebelumnya atau sumber lain, Anda dapat mengatur data geotag dengan memanggil GeotagHelper.SetGeotagAsync dan meneruskan StorageFile dan Geopoint.

var point = new Geopoint(
new BasicGeoposition
{
    Latitude = 48.8567,
    Longitude = 2.3508,
});

await GeotagHelper.SetGeotagAsync(imageFile, point);

Untuk mengatur data geotag menggunakan lokasi perangkat saat ini, buat objek Geolocator baru dan panggil GeotagHelper.SetGeotagFromGeolocatorAsync yang melewati Geolocator dan file yang akan ditandai.

var locator = new Geolocator();

// Shows the user consent UI if needed
var accessStatus = await Geolocator.RequestAccessAsync();
if (accessStatus == GeolocationAccessStatus.Allowed)
{
    await GeotagHelper.SetGeotagFromGeolocatorAsync(imageFile, locator);
}

Untuk mendapatkan GeoPoint yang mewakili lokasi geotag file gambar, panggil GetGeotagAsync.

Geopoint geoPoint = await GeotagHelper.GetGeotagAsync(imageFile);

Mendekode dan mengodekan metadata gambar

Cara paling canggih untuk bekerja dengan data gambar adalah dengan membaca dan menulis properti pada tingkat aliran menggunakan BitmapDecoder atau BitmapEncoder. Untuk operasi ini, Anda dapat menggunakan Properti Windows untuk menentukan data yang Anda baca atau tulis, tetapi Anda juga dapat menggunakan bahasa kueri metadata yang disediakan oleh Komponen Pencitraan Windows (WIC) untuk menentukan jalur ke properti yang diminta.

Membaca metadata gambar menggunakan teknik ini mengharuskan Anda memiliki BitmapDecoder yang dibuat dengan aliran file gambar sumber. Untuk informasi tentang cara melakukannya, lihat Pencitraan.

Setelah Anda memiliki dekoder, buat daftar string dan tambahkan entri baru untuk setiap properti metadata yang ingin Anda ambil, menggunakan string pengidentifikasi Properti Windows atau kueri metadata WIC. Panggil metode BitmapPropertiesView.GetPropertiesAsync pada anggota BitmapProperties decoder untuk meminta properti yang ditentukan. Properti dikembalikan dalam kamus pasangan kunci/nilai yang berisi nama atau jalur properti dan nilai properti.

private async void ReadImageMetadata(BitmapDecoder bitmapDecoder)
{

    var requests = new System.Collections.Generic.List<string>();
    requests.Add("System.Photo.Orientation"); // Windows property key for EXIF orientation
    requests.Add("/xmp/dc:creator"); // WIC metadata query for Dublin Core creator

    try
    {
        var retrievedProps = await bitmapDecoder.BitmapProperties.GetPropertiesAsync(requests);

        ushort orientation;
        if (retrievedProps.ContainsKey("System.Photo.Orientation"))
        {
            orientation = (ushort)retrievedProps["System.Photo.Orientation"].Value;
        }

        string creator;
        if (retrievedProps.ContainsKey("/xmp/dc:creator"))
        {
            creator = (string)retrievedProps["/xmp/dc:creator"].Value;
        }
    }
    catch (Exception err)
    {
        switch (err.HResult)
        {
            case unchecked((int)0x88982F41): // WINCODEC_ERR_PROPERTYNOTSUPPORTED
                                             // The file format does not support the requested metadata.
                break;
            case unchecked((int)0x88982F81): // WINCODEC_ERR_UNSUPPORTEDOPERATION
                                             // The file format does not support any metadata.
            default:
                throw err;
        }
    }
}
  • Untuk informasi tentang bahasa kueri metadata WIC dan properti yang didukung, lihat kueri metadata asli format gambar WIC.

  • Banyak properti metadata hanya didukung oleh subset jenis gambar. GetPropertiesAsync akan gagal dengan kode kesalahan 0x88982F41 jika salah satu properti yang diminta tidak didukung oleh gambar yang terkait dengan dekoder dan 0x88982F81 jika gambar tidak mendukung metadata sama sekali. Konstanta yang terkait dengan kode kesalahan ini WINCODEC_ERR_PROPERTYNOTSUPPORTED dan WINCODEC_ERR_UNSUPPORTEDOPERATION dan didefinisikan dalam file header winerror.h.

  • Karena gambar mungkin atau mungkin tidak berisi nilai untuk properti tertentu, gunakan IDictionary.ContainsKey untuk memverifikasi bahwa properti ada dalam hasil sebelum mencoba mengaksesnya.

Menulis metadata gambar ke aliran memerlukan BitmapEncoder yang terkait dengan file output gambar.

Buat objek BitmapPropertySet untuk memuat nilai properti yang ingin Anda tetapkan. Buat objek BitmapTypedValue untuk mewakili nilai properti. Objek ini menggunakan objek sebagai nilai dan anggota enumerasi PropertyType yang menentukan jenis nilai. Tambahkan BitmapTypedValue ke BitmapPropertySet lalu panggil BitmapProperties.SetPropertiesAsync untuk menyebabkan encoder menulis properti ke aliran.

private async void WriteImageMetadata(BitmapEncoder bitmapEncoder)
{
    var propertySet = new Windows.Graphics.Imaging.BitmapPropertySet();
    var orientationValue = new Windows.Graphics.Imaging.BitmapTypedValue(
        1, // Defined as EXIF orientation = "normal"
        Windows.Foundation.PropertyType.UInt16
        );

    propertySet.Add("System.Photo.Orientation", orientationValue);

    try
    {
        await bitmapEncoder.BitmapProperties.SetPropertiesAsync(propertySet);
    }
    catch (Exception err)
    {
        switch (err.HResult)
        {
            case unchecked((int)0x88982F41): // WINCODEC_ERR_PROPERTYNOTSUPPORTED
                                             // The file format does not support this property.
                break;
            default:
                throw err;
        }
    }
}