Kontrol kamera manual untuk pengambilan foto dan video

Artikel ini memperlihatkan kepada Anda cara menggunakan kontrol perangkat manual untuk mengaktifkan skenario pengambilan foto dan video yang ditingkatkan termasuk stabilisasi gambar optik dan zoom halus.

Kontrol yang dibahas dalam artikel ini semuanya ditambahkan ke aplikasi Anda menggunakan pola yang sama. Pertama, periksa untuk melihat apakah kontrol didukung pada perangkat saat ini tempat aplikasi Anda berjalan. Jika kontrol didukung, atur mode yang diinginkan untuk kontrol. Biasanya, jika kontrol tertentu tidak didukung pada perangkat saat ini, Anda harus menonaktifkan atau menyembunyikan elemen UI yang memungkinkan pengguna mengaktifkan fitur tersebut.

Kode dalam artikel ini diadaptasi dari sampel SDK Kontrol Manual Kamera. Anda dapat mengunduh sampel untuk melihat kode yang digunakan dalam konteks atau untuk menggunakan sampel sebagai titik awal untuk aplikasi Anda sendiri.

Catatan

Artikel ini dibangun berdasarkan konsep dan kode yang dibahas dalam pengambilan foto, video, dan audio Dasar dengan MediaCapture, yang menjelaskan langkah-langkah untuk menerapkan pengambilan foto dan video dasar. Sebaiknya Anda membiasakan diri dengan pola tangkapan media dasar dalam artikel tersebut sebelum beralih ke skenario penangkapan yang lebih canggih. Kode dalam artikel ini mengasumsikan bahwa aplikasi Anda sudah memiliki instans MediaCapture yang telah diinisialisasi dengan benar.

Semua API kontrol perangkat yang dibahas dalam artikel ini adalah anggota namespace Windows.Media.Devices.

using Windows.Media.Devices;

Pencahayaan

ExposureControl memungkinkan Anda mengatur kecepatan rana yang digunakan selama pengambilan foto atau video.

Contoh ini menggunakan kontrol Slider untuk menyesuaikan nilai pencahayaan saat ini dan kotak centang untuk beralih ke penyesuaian pencahayaan otomatis.

<Slider Name="ExposureSlider" ValueChanged="ExposureSlider_ValueChanged"/>
<TextBlock Name="ExposureTextBlock" Text="{Binding ElementName=ExposureSlider,Path=Value}"/>
<CheckBox Name="ExposureAutoCheckBox" Content="Auto" Checked="ExposureCheckBox_CheckedChanged" Unchecked="ExposureCheckBox_CheckedChanged"/>

Periksa untuk melihat apakah perangkat penangkapan saat ini mendukung ExposureControl dengan memeriksa properti Yang didukung . Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini. Atur status kotak centang yang dicentang untuk menunjukkan apakah penyesuaian paparan otomatis saat ini aktif ke nilai properti Otomatis.

Nilai paparan harus berada dalam rentang yang didukung oleh perangkat dan harus berupa kenaikan ukuran langkah yang didukung. Dapatkan nilai yang didukung untuk perangkat saat ini dengan memeriksa properti Min, Max, dan Step, yang digunakan untuk mengatur properti kontrol penggeser yang sesuai.

Atur nilai kontrol slider ke nilai ExposureControl saat ini setelah membatalkan pendaftaran penanganan aktivitas ValueChanged sehingga peristiwa tidak dipicu saat nilai diatur.

var exposureControl = _mediaCapture.VideoDeviceController.ExposureControl;

if (exposureControl.Supported)
{
    ExposureAutoCheckBox.Visibility = Visibility.Visible;
    ExposureSlider.Visibility = Visibility.Visible;

    ExposureAutoCheckBox.IsChecked = exposureControl.Auto;

    ExposureSlider.Minimum = exposureControl.Min.Ticks;
    ExposureSlider.Maximum = exposureControl.Max.Ticks;
    ExposureSlider.StepFrequency = exposureControl.Step.Ticks;

    ExposureSlider.ValueChanged -= ExposureSlider_ValueChanged;
    var value = exposureControl.Value;
    ExposureSlider.Value = value.Ticks;
    ExposureSlider.ValueChanged += ExposureSlider_ValueChanged;
}
else
{
    ExposureAutoCheckBox.Visibility = Visibility.Collapsed;
    ExposureSlider.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas ValueChanged, dapatkan nilai kontrol saat ini dan atur nilai paparan dengan memanggil SetValueAsync.

private async void ExposureSlider_ValueChanged(object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e)
{
    var value = TimeSpan.FromTicks((long)(sender as Slider).Value);
    await _mediaCapture.VideoDeviceController.ExposureControl.SetValueAsync(value);
}

Di kotak centang Penanganan aktivitas CheckedChanged dari pencahayaan otomatis, aktifkan atau nonaktifkan penyesuaian pencahayaan otomatis dengan memanggil SetAutoAsync dan meneruskan nilai boolean.

private async void ExposureCheckBox_CheckedChanged(object sender, RoutedEventArgs e)
{
    if(! _isPreviewing)
    {
        // Auto exposure only supported while preview stream is running.
        return;
    }

    var autoExposure = ((sender as CheckBox).IsChecked == true);
    await _mediaCapture.VideoDeviceController.ExposureControl.SetAutoAsync(autoExposure);
}

Penting

Mode paparan otomatis hanya didukung saat aliran pratinjau sedang berjalan. Periksa untuk memastikan bahwa aliran pratinjau berjalan sebelum mengaktifkan paparan otomatis.

Kompensasi paparan

ExposureCompensationControl memungkinkan Anda mengatur kompensasi paparan yang digunakan selama pengambilan foto atau video.

Contoh ini menggunakan kontrol Slider untuk menyesuaikan nilai kompensasi pencahayaan saat ini.

<Slider Name="EvSlider" ValueChanged="EvSlider_ValueChanged"/>
<TextBlock Text="{Binding ElementName=EvSlider,Path=Value}" Name="EvTextBlock"/>

Periksa untuk melihat apakah perangkat pengambilan saat ini mendukung ExposureCompensationControl dengan memeriksa properti Yang didukung . Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini.

Nilai kompensasi paparan harus berada dalam rentang yang didukung oleh perangkat dan harus berupa kenaikan ukuran langkah yang didukung. Dapatkan nilai yang didukung untuk perangkat saat ini dengan memeriksa properti Min, Max, dan Step, yang digunakan untuk mengatur properti kontrol penggeser yang sesuai.

Atur nilai kontrol slider ke nilai saat ini dari ExposureCompensationControl setelah membatalkan pendaftaran penanganan aktivitas ValueChanged sehingga peristiwa tidak dipicu saat nilai diatur.

var exposureCompensationControl = _mediaCapture.VideoDeviceController.ExposureCompensationControl;

if (exposureCompensationControl.Supported)
{
    EvSlider.Visibility = Visibility.Visible;
    EvSlider.Minimum = exposureCompensationControl.Min;
    EvSlider.Maximum = exposureCompensationControl.Max;
    EvSlider.StepFrequency = exposureCompensationControl.Step;

    EvSlider.ValueChanged -= EvSlider_ValueChanged;
    EvSlider.Value = exposureCompensationControl.Value;
    EvSlider.ValueChanged += EvSlider_ValueChanged;
}
else
{
    EvSlider.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas ValueChanged, dapatkan nilai kontrol saat ini dan atur nilai paparan dengan memanggil SetValueAsync.

private async void EvSlider_ValueChanged(object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e)
{
    var value = (sender as Slider).Value;
    await _mediaCapture.VideoDeviceController.ExposureCompensationControl.SetValueAsync((float)value);
}

Blitz

FlashControl memungkinkan Anda mengaktifkan atau menonaktifkan lampu kilat atau mengaktifkan lampu kilat otomatis, di mana sistem secara dinamis menentukan apakah akan menggunakan lampu kilat. Kontrol ini juga memungkinkan Anda mengaktifkan pengurangan mata merah otomatis pada perangkat yang mendukungnya. Semua pengaturan ini berlaku untuk mengambil foto. TorchControl adalah kontrol terpisah untuk mengaktifkan atau menonaktifkan obor untuk pengambilan video.

Contoh ini menggunakan sekumpulan tombol radio untuk memungkinkan pengguna beralih antara pengaturan lampu kilat aktif, nonaktif, dan otomatis. Kotak centang juga disediakan untuk memungkinkan pengalihan pengurangan mata merah dan obor video.

<RadioButton Name="FlashOnRadioButton" Content="On" Checked="FlashOnRadioButton_Checked"/>
<RadioButton Name="FlashAutoRadioButton" Content="Auto" Checked="FlashAutoRadioButton_Checked"/>
<RadioButton Name="FlashOffRadioButton" Content="Off" Checked="FlashOffRadioButton_Checked"/>
<CheckBox Name="RedEyeFlashCheckBox" Content="Red Eye" Visibility="Collapsed" Checked="RedEyeFlashCheckBox_CheckedChanged" Unchecked="RedEyeFlashCheckBox_CheckedChanged"/>
<CheckBox Name="TorchCheckBox" Content="Video Light" Visibility="Collapsed" Checked="TorchCheckBox_CheckedChanged" Unchecked="TorchCheckBox_CheckedChanged"/>

Periksa untuk melihat apakah perangkat pengambilan saat ini mendukung FlashControl dengan memeriksa properti Yang didukung. Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini. Jika FlashControl didukung, pengurangan mata merah otomatis mungkin atau mungkin tidak didukung, jadi periksa properti RedEyeReductionSupported sebelum mengaktifkan UI. Karena TorchControl terpisah dari kontrol lampu kilat, Anda juga harus memeriksa properti Didukung sebelum menggunakannya.

Di penanganan aktivitas yang diperiksa untuk setiap tombol radio flash, aktifkan atau nonaktifkan pengaturan lampu kilat yang sesuai. Perhatikan bahwa untuk mengatur lampu kilat agar selalu digunakan, Anda harus mengatur properti Diaktifkan ke true dan properti Otomatis ke false.

var flashControl = _mediaCapture.VideoDeviceController.FlashControl;

if (flashControl.Supported)
{
    FlashAutoRadioButton.Visibility = Visibility.Visible;
    FlashOnRadioButton.Visibility = Visibility.Visible;
    FlashOffRadioButton.Visibility = Visibility.Visible;

    FlashAutoRadioButton.IsChecked = true;

    if (flashControl.RedEyeReductionSupported)
    {
        RedEyeFlashCheckBox.Visibility = Visibility.Visible;
    }

    // Video light is not strictly part of flash, but users might expect to find it there
    if (_mediaCapture.VideoDeviceController.TorchControl.Supported)
    {
        TorchCheckBox.Visibility = Visibility.Visible;
    }
}
else
{
    FlashAutoRadioButton.Visibility = Visibility.Collapsed;
    FlashOnRadioButton.Visibility = Visibility.Collapsed;
    FlashOffRadioButton.Visibility = Visibility.Collapsed;
}
private void FlashOnRadioButton_Checked(object sender, RoutedEventArgs e)
{
    _mediaCapture.VideoDeviceController.FlashControl.Enabled = true;
    _mediaCapture.VideoDeviceController.FlashControl.Auto = false;
}

private void FlashAutoRadioButton_Checked(object sender, RoutedEventArgs e)
{
    _mediaCapture.VideoDeviceController.FlashControl.Enabled = true;
    _mediaCapture.VideoDeviceController.FlashControl.Auto = true;
}

private void FlashOffRadioButton_Checked(object sender, RoutedEventArgs e)
{
    _mediaCapture.VideoDeviceController.FlashControl.Enabled = false;
}

Di kotak centang handler untuk pengurangan mata merah, atur properti RedEyeReduction ke nilai yang sesuai.

private void RedEyeFlashCheckBox_CheckedChanged(object sender, RoutedEventArgs e)
{
    _mediaCapture.VideoDeviceController.FlashControl.RedEyeReduction = (RedEyeFlashCheckBox.IsChecked == true);
}

Terakhir, di kotak centang handler untuk obor video, atur properti Diaktifkan ke nilai yang sesuai.

private void TorchCheckBox_CheckedChanged(object sender, RoutedEventArgs e)
{
    _mediaCapture.VideoDeviceController.TorchControl.Enabled = (TorchCheckBox.IsChecked == true);

    if(! (_isPreviewing && _isRecording))
    {
        System.Diagnostics.Debug.WriteLine("Torch may not emit light if preview and video capture are not running.");
    }
}

Catatan

Pada beberapa perangkat, obor tidak akan memancarkan cahaya, bahkan jika TorchControl.Enabled diatur ke true, kecuali perangkat memiliki aliran pratinjau yang berjalan dan secara aktif menangkap video. Urutan operasi yang direkomendasikan adalah mengaktifkan pratinjau video, mengaktifkan obor dengan mengatur Diaktifkan ke true, lalu memulai pengambilan video. Pada beberapa perangkat, obor akan menyala setelah pratinjau dimulai. Pada perangkat lain, obor mungkin tidak menyala sampai pengambilan video dimulai.

Fokus

Tiga metode berbeda yang umum digunakan untuk menyesuaikan fokus kamera didukung oleh objek FocusControl , fokus otomatis berkelanjutan, ketuk untuk fokus, dan fokus manual. Aplikasi kamera dapat mendukung ketiga metode ini, tetapi untuk keterbacaan, artikel ini membahas setiap teknik secara terpisah. Bagian ini juga membahas cara mengaktifkan lampu bantuan fokus.

Fokus otomatis berkelanjutan

Mengaktifkan fokus otomatis berkelanjutan menginstruksikan kamera untuk menyesuaikan fokus secara dinamis untuk mencoba menjaga subjek foto atau video tetap fokus. Contoh ini menggunakan tombol radio untuk mengaktifkan dan menonaktifkan fokus otomatis berkelanjutan.

<RadioButton Content="CAF" Name="CafFocusRadioButton" Checked="CafFocusRadioButton_Checked"/>

Periksa untuk melihat apakah perangkat penangkapan saat ini mendukung FocusControl dengan memeriksa properti Yang didukung . Selanjutnya, tentukan apakah fokus otomatis berkelanjutan didukung dengan memeriksa daftar SupportedFocusModes untuk melihat apakah berisi nilai FocusMode.Continuous, dan jika demikian, tampilkan tombol radio fokus otomatis berkelanjutan.

var focusControl = _mediaCapture.VideoDeviceController.FocusControl;

if (focusControl.Supported)
{
    CafFocusRadioButton.Visibility = focusControl.SupportedFocusModes.Contains(FocusMode.Continuous) 
        ? Visibility.Visible : Visibility.Collapsed;
}
else
{
    CafFocusRadioButton.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas yang diperiksa untuk tombol radio fokus otomatis berkelanjutan, gunakan properti VideoDeviceController.FocusControl untuk mendapatkan instans kontrol. Panggil UnlockAsync untuk membuka kunci kontrol jika aplikasi Anda sebelumnya disebut LockAsync untuk mengaktifkan salah satu mode fokus lainnya.

Buat objek Fokus Pengaturan baru dan atur properti Mode ke Berkelanjutan. Atur properti AutoFocusRange ke nilai yang sesuai untuk skenario aplikasi Anda atau dipilih oleh pengguna dari UI Anda. Teruskan objek Fokus Pengaturan Anda ke dalam metode Konfigurasi, lalu panggil FocusAsync untuk memulai fokus otomatis berkelanjutan.

private async void CafFocusRadioButton_Checked(object sender, RoutedEventArgs e)
{
    if(! _isPreviewing)
    {
        // Autofocus only supported while preview stream is running.
        return;
    }

    var focusControl = _mediaCapture.VideoDeviceController.FocusControl;
    await focusControl.UnlockAsync();
    var settings = new FocusSettings { Mode = FocusMode.Continuous, AutoFocusRange = AutoFocusRange.FullRange };
    focusControl.Configure(settings);
    await focusControl.FocusAsync();
}

Penting

Mode fokus otomatis hanya didukung saat aliran pratinjau sedang berjalan. Periksa untuk memastikan bahwa aliran pratinjau berjalan sebelum mengaktifkan fokus otomatis berkelanjutan.

Ketuk untuk memfokuskan

Teknik ketuk-ke-fokus menggunakan FocusControl dan RegionsOfInterestControl untuk menentukan subregsi bingkai pengambilan tempat perangkat pengambilan harus fokus. Wilayah fokus ditentukan oleh pengguna yang mengetuk layar yang menampilkan aliran pratinjau.

Contoh ini menggunakan tombol radio untuk mengaktifkan dan menonaktifkan mode ketuk-ke-fokus.

<RadioButton Content="Tap" Name="TapFocusRadioButton" Checked="TapFocusRadioButton_Checked"/>

Periksa untuk melihat apakah perangkat penangkapan saat ini mendukung FocusControl dengan memeriksa properti Yang didukung . RegionsOfInterestControl harus didukung, dan harus mendukung setidaknya satu wilayah, untuk menggunakan teknik ini. Periksa properti AutoFocusSupported dan MaxRegions untuk menentukan apakah akan menampilkan atau menyembunyikan tombol radio untuk ketuk-ke-fokus.

var focusControl = _mediaCapture.VideoDeviceController.FocusControl;

if (focusControl.Supported)
{
    TapFocusRadioButton.Visibility = (_mediaCapture.VideoDeviceController.RegionsOfInterestControl.AutoFocusSupported &&
                                      _mediaCapture.VideoDeviceController.RegionsOfInterestControl.MaxRegions > 0) 
                                      ? Visibility.Visible : Visibility.Collapsed;
}
else
{
    TapFocusRadioButton.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas yang diperiksa untuk tombol radio tap-to-focus, gunakan properti VideoDeviceController.FocusControl untuk mendapatkan instans kontrol. Panggil LockAsync untuk mengunci kontrol jika aplikasi Anda sebelumnya disebut UnlockAsync untuk mengaktifkan fokus otomatis berkelanjutan, lalu tunggu pengguna mengetuk layar untuk mengubah fokus.

private async void TapFocusRadioButton_Checked(object sender, RoutedEventArgs e)
{
    // Lock focus in case Continuous Autofocus was active when switching to Tap-to-focus
    var focusControl = _mediaCapture.VideoDeviceController.FocusControl;
    await focusControl.LockAsync();
    // Wait for user tap
}

Contoh ini berfokus pada wilayah saat pengguna mengetuk layar, lalu menghapus fokus dari wilayah tersebut saat pengguna mengetuk lagi, seperti tombol. Gunakan variabel boolean untuk melacak status beralih saat ini.

bool _isFocused = false;

Langkah selanjutnya adalah mendengarkan peristiwa saat pengguna mengetuk layar dengan menangani peristiwa Yang diketuk dari CaptureElement yang saat ini menampilkan aliran pratinjau pengambilan. Jika kamera saat ini tidak mempratinjau, atau jika mode ketuk-ke-fokus dinonaktifkan, kembali dari handler tanpa melakukan apa pun.

Jika variabel pelacakan _isFocused dialihkan ke false, dan jika kamera saat ini tidak dalam proses fokus (ditentukan oleh properti FocusState dari FocusControl), mulai proses ketuk-ke-fokus. Dapatkan posisi ketukan pengguna dari arg peristiwa yang diteruskan ke handler. Contoh ini juga menggunakan kesempatan ini untuk memilih ukuran wilayah yang akan difokuskan. Dalam hal ini, ukurannya adalah 1/4 dari dimensi terkecil dari elemen tangkapan. Teruskan posisi ketuk dan ukuran wilayah ke dalam metode pembantu TapToFocus yang ditentukan di bagian berikutnya.

Jika tombol _isFocused diatur ke true, ketuk pengguna harus menghapus fokus dari wilayah sebelumnya. Ini dilakukan dalam metode pembantu TapUnfocus yang ditunjukkan di bawah ini.

private async void PreviewControl_Tapped(object sender, TappedRoutedEventArgs e)
{
    if (!_isPreviewing || (TapFocusRadioButton.IsChecked != true)) return;

    if (!_isFocused && _mediaCapture.VideoDeviceController.FocusControl.FocusState != MediaCaptureFocusState.Searching)
    {
        var smallEdge = Math.Min(Window.Current.Bounds.Width, Window.Current.Bounds.Height);

        // Choose to make the focus rectangle 1/4th the length of the shortest edge of the window
        var size = new Size(smallEdge / 4, smallEdge / 4);
        var position = e.GetPosition(sender as UIElement);

        // Note that at this point, a rect at "position" with size "size" could extend beyond the preview area. The following method will reposition the rect if that is the case
        await TapToFocus(position, size);
    }
    else
    {
        await TapUnfocus();
    }
}

Dalam metode pembantu TapToFocus , pertama-tama atur tombol _isFocused ke true sehingga ketukan layar berikutnya akan melepaskan fokus dari wilayah yang diketuk.

Tugas berikutnya dalam metode pembantu ini adalah menentukan persegi panjang dalam aliran pratinjau yang akan ditetapkan ke kontrol fokus. Ini membutuhkan dua langkah. Langkah pertama adalah menentukan persegi panjang yang diambil aliran pratinjau dalam kontrol CaptureElement. Ini tergantung pada dimensi aliran pratinjau dan orientasi perangkat. Metode pembantu GetPreviewStreamRectInControl, yang ditunjukkan di akhir bagian ini, melakukan tugas ini dan mengembalikan persegi panjang yang berisi aliran pratinjau.

Tugas berikutnya di TapToFocus adalah mengonversi lokasi ketukan dan ukuran persegi panjang fokus yang diinginkan, yang ditentukan dalam penanganan aktivitas CaptureElement.Tapped , menjadi koordinat dalam aliran pengambilan. Metode pembantu ConvertUiTapToPreviewRect , yang ditunjukkan nanti di bagian ini, melakukan konversi ini dan mengembalikan persegi panjang, dalam mengambil koordinat aliran, di mana fokus akan diminta.

Sekarang setelah persegi panjang target telah diperoleh, buat objek RegionOfInterest baru, atur properti Batas ke persegi panjang target yang diperoleh di langkah-langkah sebelumnya.

Dapatkan FocusControl perangkat tangkapan. Buat objek Focus Pengaturan baru dan atur Mode dan AutoFocusRange ke nilai yang Anda inginkan, setelah memeriksa untuk memastikan bahwa objek didukung oleh FocusControl. Panggil Konfigurasikan pada FocusControl untuk membuat pengaturan Anda aktif dan memberi sinyal perangkat untuk mulai berfokus pada wilayah yang ditentukan.

Selanjutnya, dapatkan RegionsOfInterestControl perangkat tangkap dan panggil SetRegionsAsync untuk mengatur wilayah aktif. Beberapa wilayah yang menarik dapat diatur pada perangkat yang mendukungnya, tetapi contoh ini hanya menetapkan satu wilayah.

Terakhir, panggil FocusAsync pada FocusControl untuk memulai pemfokusan.

Penting

Saat menerapkan ketukan untuk fokus, urutan operasi penting. Anda harus memanggil API ini dalam urutan berikut:

  1. FocusControl.Configure
  2. RegionsOfInterestControl.SetRegionsAsync
  3. FocusControl.FocusAsync
public async Task TapToFocus(Point position, Size size)
{
    _isFocused = true;

    var previewRect = GetPreviewStreamRectInControl();
    var focusPreview = ConvertUiTapToPreviewRect(position, size, previewRect);

    // Note that this Region Of Interest could be configured to also calculate exposure 
    // and white balance within the region
    var regionOfInterest = new RegionOfInterest
    {
        AutoFocusEnabled = true,
        BoundsNormalized = true,
        Bounds = focusPreview,
        Type = RegionOfInterestType.Unknown,
        Weight = 100,
    };


    var focusControl = _mediaCapture.VideoDeviceController.FocusControl;
    var focusRange = focusControl.SupportedFocusRanges.Contains(AutoFocusRange.FullRange) ? AutoFocusRange.FullRange : focusControl.SupportedFocusRanges.FirstOrDefault();
    var focusMode = focusControl.SupportedFocusModes.Contains(FocusMode.Single) ? FocusMode.Single : focusControl.SupportedFocusModes.FirstOrDefault();
    var settings = new FocusSettings { Mode = focusMode, AutoFocusRange = focusRange };
    focusControl.Configure(settings);

    var roiControl = _mediaCapture.VideoDeviceController.RegionsOfInterestControl;
    await roiControl.SetRegionsAsync(new[] { regionOfInterest }, true);

    await focusControl.FocusAsync();
}

Dalam metode pembantu TapUnfocus, dapatkan RegionsOfInterestControl dan panggil ClearRegionsAsync untuk menghapus wilayah yang terdaftar dengan kontrol dalam metode pembantu TapToFocus. Kemudian, dapatkan FocusControl dan panggil FocusAsync untuk menyebabkan perangkat fokus ulang tanpa wilayah yang diinginkan.

private async Task TapUnfocus()
{
    _isFocused = false;

    var roiControl = _mediaCapture.VideoDeviceController.RegionsOfInterestControl;
    await roiControl.ClearRegionsAsync();

    var focusControl = _mediaCapture.VideoDeviceController.FocusControl;
    await focusControl.FocusAsync();
}

Metode pembantu GetPreviewStreamRectInControl menggunakan resolusi aliran pratinjau dan orientasi perangkat untuk menentukan persegi panjang dalam elemen pratinjau yang berisi aliran pratinjau, memangkas padding kotak surat apa pun yang dapat diberikan kontrol untuk mempertahankan rasio aspek aliran. Metode ini menggunakan variabel anggota kelas yang ditentukan dalam kode contoh pengambilan media dasar yang ditemukan di Pengambilan foto, video, dan audio Dasar dengan MediaCapture.

public Rect GetPreviewStreamRectInControl()
{
    var result = new Rect();

    var previewResolution = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;

    // In case this function is called before everything is initialized correctly, return an empty result
    if (PreviewControl == null || PreviewControl.ActualHeight < 1 || PreviewControl.ActualWidth < 1 ||
        previewResolution == null || previewResolution.Height == 0 || previewResolution.Width == 0)
    {
        return result;
    }

    var streamWidth = previewResolution.Width;
    var streamHeight = previewResolution.Height;

    // For portrait orientations, the width and height need to be swapped
    if (_displayOrientation == DisplayOrientations.Portrait || _displayOrientation == DisplayOrientations.PortraitFlipped)
    {
        streamWidth = previewResolution.Height;
        streamHeight = previewResolution.Width;
    }

    // Start by assuming the preview display area in the control spans the entire width and height both (this is corrected in the next if for the necessary dimension)
    result.Width = PreviewControl.ActualWidth;
    result.Height = PreviewControl.ActualHeight;

    // If UI is "wider" than preview, letterboxing will be on the sides
    if ((PreviewControl.ActualWidth / PreviewControl.ActualHeight > streamWidth / (double)streamHeight))
    {
        var scale = PreviewControl.ActualHeight / streamHeight;
        var scaledWidth = streamWidth * scale;

        result.X = (PreviewControl.ActualWidth - scaledWidth) / 2.0;
        result.Width = scaledWidth;
    }
    else // Preview stream is "wider" than UI, so letterboxing will be on the top+bottom
    {
        var scale = PreviewControl.ActualWidth / streamWidth;
        var scaledHeight = streamHeight * scale;

        result.Y = (PreviewControl.ActualHeight - scaledHeight) / 2.0;
        result.Height = scaledHeight;
    }

    return result;
}

Metode pembantu ConvertUiTapToPreviewRect mengambil sebagai argumen lokasi peristiwa ketukan, ukuran wilayah fokus yang diinginkan, dan persegi panjang yang berisi aliran pratinjau yang diperoleh dari metode pembantu GetPreviewStreamRectInControl . Metode ini menggunakan nilai-nilai ini dan orientasi perangkat saat ini untuk menghitung persegi panjang dalam aliran pratinjau yang berisi wilayah yang diinginkan. Sekali lagi, metode ini menggunakan variabel anggota kelas yang ditentukan dalam kode contoh pengambilan media dasar yang ditemukan di Ambil Foto dan Video dengan MediaCapture.

private Rect ConvertUiTapToPreviewRect(Point tap, Size size, Rect previewRect)
{
    // Adjust for the resulting focus rectangle to be centered around the position
    double left = tap.X - size.Width / 2, top = tap.Y - size.Height / 2;

    // Get the information about the active preview area within the CaptureElement (in case it's letterboxed)
    double previewWidth = previewRect.Width, previewHeight = previewRect.Height;
    double previewLeft = previewRect.Left, previewTop = previewRect.Top;

    // Transform the left and top of the tap to account for rotation
    switch (_displayOrientation)
    {
        case DisplayOrientations.Portrait:
            var tempLeft = left;

            left = top;
            top = previewRect.Width - tempLeft;
            break;
        case DisplayOrientations.LandscapeFlipped:
            left = previewRect.Width - left;
            top = previewRect.Height - top;
            break;
        case DisplayOrientations.PortraitFlipped:
            var tempTop = top;

            top = left;
            left = previewRect.Width - tempTop;
            break;
    }

    // For portrait orientations, the information about the active preview area needs to be rotated
    if (_displayOrientation == DisplayOrientations.Portrait || _displayOrientation == DisplayOrientations.PortraitFlipped)
    {
        previewWidth = previewRect.Height;
        previewHeight = previewRect.Width;
        previewLeft = previewRect.Top;
        previewTop = previewRect.Left;
    }

    // Normalize width and height of the focus rectangle
    var width = size.Width / previewWidth;
    var height = size.Height / previewHeight;

    // Shift rect left and top to be relative to just the active preview area
    left -= previewLeft;
    top -= previewTop;

    // Normalize left and top
    left /= previewWidth;
    top /= previewHeight;

    // Ensure rectangle is fully contained within the active preview area horizontally
    left = Math.Max(left, 0);
    left = Math.Min(1 - width, left);

    // Ensure rectangle is fully contained within the active preview area vertically
    top = Math.Max(top, 0);
    top = Math.Min(1 - height, top);

    // Create and return resulting rectangle
    return new Rect(left, top, width, height);
}

Fokus manual

Teknik fokus manual menggunakan kontrol Slider untuk mengatur kedalaman fokus perangkat penangkapan saat ini. Tombol radio digunakan untuk mengaktifkan dan menonaktifkan fokus manual.

<Slider Name="FocusSlider" IsEnabled="{Binding ElementName=ManualFocusRadioButton,Path=IsChecked}" ValueChanged="FocusSlider_ValueChanged"/>
<TextBlock Text="{Binding ElementName=FocusSlider,Path=Value,FallbackValue='0'}"/>
<RadioButton Content="Manual" Name="ManualFocusRadioButton" Checked="ManualFocusRadioButton_Checked" IsChecked="False"/>

Periksa untuk melihat apakah perangkat penangkapan saat ini mendukung FocusControl dengan memeriksa properti Yang didukung . Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini.

Nilai fokus harus berada dalam rentang yang didukung oleh perangkat dan harus bertambah dari ukuran langkah yang didukung. Dapatkan nilai yang didukung untuk perangkat saat ini dengan memeriksa properti Min, Max, dan Step, yang digunakan untuk mengatur properti kontrol penggeser yang sesuai.

Atur nilai kontrol slider ke nilai FocusControl saat ini setelah membatalkan pendaftaran penanganan aktivitas ValueChanged sehingga peristiwa tidak dipicu saat nilai diatur.

var focusControl = _mediaCapture.VideoDeviceController.FocusControl;

if (focusControl.Supported)
{
    FocusSlider.Visibility = Visibility.Visible;
    ManualFocusRadioButton.Visibility = Visibility.Visible;

    FocusSlider.Minimum = focusControl.Min;
    FocusSlider.Maximum = focusControl.Max;
    FocusSlider.StepFrequency = focusControl.Step;
    

    FocusSlider.ValueChanged -= FocusSlider_ValueChanged;
    FocusSlider.Value = focusControl.Value;
    FocusSlider.ValueChanged += FocusSlider_ValueChanged;
}
else
{
    FocusSlider.Visibility = Visibility.Collapsed;
    ManualFocusRadioButton.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas yang diperiksa untuk tombol radio fokus manual, dapatkan objek FocusControl dan panggil LockAsync jika aplikasi Anda sebelumnya membuka fokus dengan panggilan ke UnlockAsync.

private async void ManualFocusRadioButton_Checked(object sender, RoutedEventArgs e)
{
    var focusControl = _mediaCapture.VideoDeviceController.FocusControl;
    await focusControl.LockAsync();
}

Di penanganan aktivitas ValueChanged dari penggeledah fokus manual, dapatkan nilai kontrol saat ini dan atur nilai fokus dengan memanggil SetValueAsync.

private async void FocusSlider_ValueChanged(object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e)
{
    var value = (sender as Slider).Value;
    await _mediaCapture.VideoDeviceController.FocusControl.SetValueAsync((uint)value);
}

Mengaktifkan lampu fokus

Pada perangkat yang mendukungnya, Anda dapat mengaktifkan lampu bantuan fokus untuk membantu fokus perangkat. Contoh ini menggunakan kotak centang untuk mengaktifkan atau menonaktifkan lampu bantuan fokus.

<CheckBox Content="Assist Light" Name="FocusLightCheckBox" IsEnabled="{Binding ElementName=TapFocusRadioButton,Path=IsChecked}"
                  Checked="FocusLightCheckBox_CheckedChanged" Unchecked="FocusLightCheckBox_CheckedChanged"/>

Periksa untuk melihat apakah perangkat pengambilan saat ini mendukung FlashControl dengan memeriksa properti Yang didukung. Periksa juga AssistantLightSupported untuk memastikan lampu bantuan juga didukung. Jika keduanya didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini.

var focusControl = _mediaCapture.VideoDeviceController.FocusControl;

if (focusControl.Supported)
{

    FocusLightCheckBox.Visibility = (_mediaCapture.VideoDeviceController.FlashControl.Supported &&
                                     _mediaCapture.VideoDeviceController.FlashControl.AssistantLightSupported) ? Visibility.Visible : Visibility.Collapsed;
}
else
{
    FocusLightCheckBox.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas CheckedChanged, dapatkan perangkat tangkapan objek FlashControl. Atur properti AssistantLightEnabled untuk mengaktifkan atau menonaktifkan lampu fokus.

private void FocusLightCheckBox_CheckedChanged(object sender, RoutedEventArgs e)
{
    var flashControl = _mediaCapture.VideoDeviceController.FlashControl;

    flashControl.AssistantLightEnabled = (FocusLightCheckBox.IsChecked == true);
}

Kecepatan ISO

IsoSpeedControl memungkinkan Anda mengatur kecepatan ISO yang digunakan selama pengambilan foto atau video.

Contoh ini menggunakan kontrol Slider untuk menyesuaikan nilai kompensasi pencahayaan saat ini dan kotak centang untuk mengalihkan penyesuaian kecepatan ISO otomatis.

<Slider Name="IsoSlider" ValueChanged="IsoSlider_ValueChanged"/>
<TextBlock Text="{Binding ElementName=IsoSlider,Path=Value}" Visibility="{Binding ElementName=IsoSlider,Path=Visibility}"/>
<CheckBox Name="IsoAutoCheckBox" Content="Auto" Checked="IsoAutoCheckBox_CheckedChanged" Unchecked="IsoAutoCheckBox_CheckedChanged"/>

Periksa untuk melihat apakah perangkat pengambilan saat ini mendukung IsoSpeedControl dengan memeriksa properti Yang didukung. Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini. Atur status kotak centang yang dicentang untuk menunjukkan apakah penyesuaian kecepatan ISO otomatis saat ini aktif ke nilai properti Otomatis.

Nilai kecepatan ISO harus berada dalam rentang yang didukung oleh perangkat dan harus kenaikan ukuran langkah yang didukung. Dapatkan nilai yang didukung untuk perangkat saat ini dengan memeriksa properti Min, Max, dan Step, yang digunakan untuk mengatur properti kontrol penggeser yang sesuai.

Atur nilai kontrol slider ke nilai IsoSpeedControl saat ini setelah membatalkan pendaftaran penanganan aktivitas ValueChanged sehingga peristiwa tidak dipicu saat nilai diatur.

private void UpdateIsoControlCapabilities()
{
    var isoSpeedControl = _mediaCapture.VideoDeviceController.IsoSpeedControl;

    if (isoSpeedControl.Supported)
    {
        IsoAutoCheckBox.Visibility = Visibility.Visible;
        IsoSlider.Visibility = Visibility.Visible;

        IsoAutoCheckBox.IsChecked = isoSpeedControl.Auto;
        
        IsoSlider.Minimum = isoSpeedControl.Min;
        IsoSlider.Maximum = isoSpeedControl.Max;
        IsoSlider.StepFrequency = isoSpeedControl.Step;

        IsoSlider.ValueChanged -= IsoSlider_ValueChanged;
        IsoSlider.Value = isoSpeedControl.Value;
        IsoSlider.ValueChanged += IsoSlider_ValueChanged;
    }
    else
    {
        IsoAutoCheckBox.Visibility = Visibility.Collapsed;
        IsoSlider.Visibility = Visibility.Collapsed;
    }
}

Di penanganan aktivitas ValueChanged, dapatkan nilai kontrol saat ini dan atur nilai kecepatan ISO dengan memanggil SetValueAsync.

private async void IsoSlider_ValueChanged(object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e)
{
    var value = (sender as Slider).Value;
    await _mediaCapture.VideoDeviceController.IsoSpeedControl.SetValueAsync((uint)value);
}

Di kotak centang Penanganan aktivitas CheckedChanged dari kecepatan ISO otomatis, aktifkan penyesuaian kecepatan ISO otomatis dengan memanggil SetAutoAsync. Nonaktifkan penyesuaian kecepatan ISO otomatis dengan memanggil SetValueAsync dan meneruskan nilai kontrol penggunjuk saat ini.

private async void IsoAutoCheckBox_CheckedChanged(object sender, RoutedEventArgs e)
{
    var autoIso = (sender as CheckBox).IsChecked == true;

    if (autoIso)
    {
        await _mediaCapture.VideoDeviceController.IsoSpeedControl.SetAutoAsync();
    }
    else
    {
        await _mediaCapture.VideoDeviceController.IsoSpeedControl.SetValueAsync((uint)IsoSlider.Value);
    }
}

Stabilisasi gambar optik

Stabilisasi gambar optik (OIS) menstabilkan aliran video yang diambil dengan memanipulasi perangkat pengambilan perangkat keras secara mekanis, yang dapat memberikan hasil yang unggul daripada stabilisasi digital. Pada perangkat yang tidak mendukung OIS, Anda dapat menggunakan VideoStabilizationEffect untuk melakukan stabilisasi digital pada vide yang diambil. Untuk informasi selengkapnya, lihat Efek untuk pengambilan video.

Tentukan apakah OIS didukung pada perangkat saat ini dengan memeriksa properti OpticalImageStabilizationControl.Supported.

Kontrol OIS mendukung tiga mode: aktif, nonaktif, dan otomatis, yang berarti bahwa perangkat secara dinamis menentukan apakah OIS akan meningkatkan tangkapan media dan, jika demikian, memungkinkan OIS. Untuk menentukan apakah mode tertentu didukung pada perangkat, periksa untuk melihat apakah koleksi OpticalImageStabilizationControl.SupportedModes berisi mode yang diinginkan.

Aktifkan atau nonaktifkan OIS dengan mengatur OpticalImageStabilizationControl.Mode ke mode yang diinginkan.

private void SetOpticalImageStabilizationMode(OpticalImageStabilizationMode mode)
{
    if (!_mediaCapture.VideoDeviceController.OpticalImageStabilizationControl.Supported)
    {
        ShowMessageToUser("Optical image stabilization not available");
        return;
    }

    var stabilizationModes = _mediaCapture.VideoDeviceController.OpticalImageStabilizationControl.SupportedModes;

    if (!stabilizationModes.Contains(mode))
    {
        ShowMessageToUser("Optical image stabilization setting not supported");
        return;
    }

    _mediaCapture.VideoDeviceController.OpticalImageStabilizationControl.Mode = mode;
}

Frekuensi powerline

Beberapa perangkat kamera mendukung pemrosesan anti-berkedip yang bergantung pada mengetahui frekuensi AC powerline di lingkungan saat ini. Beberapa perangkat mendukung penentuan otomatis frekuensi powerline, sementara perangkat lain mengharuskan frekuensi diatur secara manual. Contoh kode berikut menunjukkan cara menentukan dukungan frekuensi powerline pada perangkat dan, jika diperlukan, cara mengatur frekuensi secara manual.

Pertama, panggil metode VideoDeviceController TryGetPowerlineFrequency, meneruskan parameter output jenis PowerlineFrequency; jika panggilan ini gagal, kontrol frekuensi powerline tidak didukung pada perangkat saat ini. Jika fitur didukung, Anda dapat menentukan apakah mode otomatis tersedia di perangkat dengan mencoba mengatur mode otomatis. Lakukan ini dengan memanggil TrySetPowerlineFrequency dan meneruskan nilai Secara Otomatis. Jika panggilan berhasil, itu berarti frekuensi powerline otomatis Anda didukung. Jika pengontrol frekuensi powerline didukung pada perangkat tetapi deteksi frekuensi otomatis tidak, Anda masih dapat mengatur frekuensi secara manual dengan menggunakan TrySetPowerlineFrequency. Dalam contoh ini, MyCustomFrequencyLookup adalah metode kustom yang Anda terapkan untuk menentukan frekuensi yang benar untuk lokasi perangkat saat ini.

 PowerlineFrequency getFrequency;

 if (! _mediaCapture.VideoDeviceController.TryGetPowerlineFrequency(out getFrequency))
 {
     // Powerline frequency is not supported on this device.
     return;
 }

 if (! _mediaCapture.VideoDeviceController.TrySetPowerlineFrequency(PowerlineFrequency.Auto))
 {
     // Set the frequency manually
     PowerlineFrequency setFrequency = MyCustomFrequencyLookup();
     if (_mediaCapture.VideoDeviceController.TrySetPowerlineFrequency(setFrequency))
     {
         System.Diagnostics.Debug.WriteLine(String.Format("Powerline frequency manually set to {0}.", setFrequency));
     }
 }

Keseimbangan putih

WhiteBalanceControl memungkinkan Anda mengatur keseimbangan putih yang digunakan selama pengambilan foto atau video.

Contoh ini menggunakan kontrol ComboBox untuk memilih dari preset suhu warna bawaan dan kontrol Slider untuk penyesuaian keseimbangan putih manual.

<Slider Name="WbSlider" ValueChanged="WbSlider_ValueChanged"/>
<TextBlock Name="WbTextBox" Text="{Binding ElementName=WbSlider,Path=Value}" Visibility="{Binding ElementName=WbSlider,Path=Visibility}"/>
<ComboBox Name="WbComboBox" SelectionChanged="WbComboBox_SelectionChanged"/>

Periksa untuk melihat apakah perangkat pengambilan saat ini mendukung WhiteBalanceControl dengan memeriksa properti Yang didukung. Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini. Atur item kotak kombo ke nilai enumerasi ColorTemperaturePreset. Dan atur item yang dipilih ke nilai properti Preset saat ini.

Untuk kontrol manual, nilai keseimbangan putih harus berada dalam rentang yang didukung oleh perangkat dan harus menjadi kenaikan ukuran langkah yang didukung. Dapatkan nilai yang didukung untuk perangkat saat ini dengan memeriksa properti Min, Max, dan Step, yang digunakan untuk mengatur properti kontrol penggeser yang sesuai. Sebelum mengaktifkan kontrol manual, periksa untuk memastikan bahwa rentang antara nilai minimum dan maksimum yang didukung lebih besar dari ukuran langkah. Jika tidak, kontrol manual tidak didukung pada perangkat saat ini.

Atur nilai kontrol slider ke nilai WhiteBalanceControl saat ini setelah membatalkan pendaftaran penanganan aktivitas ValueChanged sehingga peristiwa tidak dipicu saat nilai diatur.

           var whiteBalanceControl = _mediaCapture.VideoDeviceController.WhiteBalanceControl;

           if (whiteBalanceControl.Supported)
           {
               WbSlider.Visibility = Visibility.Visible;
               WbComboBox.Visibility = Visibility.Visible;

               if (WbComboBox.ItemsSource == null)
               {
                   WbComboBox.ItemsSource = Enum.GetValues(typeof(ColorTemperaturePreset)).Cast<ColorTemperaturePreset>();
               }

               WbComboBox.SelectedItem = whiteBalanceControl.Preset;

               if (whiteBalanceControl.Max - whiteBalanceControl.Min > whiteBalanceControl.Step)
               {

                   WbSlider.Minimum = whiteBalanceControl.Min;
                   WbSlider.Maximum = whiteBalanceControl.Max;
                   WbSlider.StepFrequency = whiteBalanceControl.Step;

                   WbSlider.ValueChanged -= WbSlider_ValueChanged;
                   WbSlider.Value = whiteBalanceControl.Value;
                   WbSlider.ValueChanged += WbSlider_ValueChanged;
               }
               else
               {
                   WbSlider.Visibility = Visibility.Collapsed;
               }
           }
           else
           {
               WbSlider.Visibility = Visibility.Collapsed;
               WbComboBox.Visibility = Visibility.Collapsed;
           }

Dalam kotak kombo penangan aktivitas SelectionChanged dari prasetel suhu warna, dapatkan preset yang saat ini dipilih dan atur nilai kontrol dengan memanggil SetPresetAsync. Jika nilai prasetel yang dipilih bukan Manual, nonaktifkan penggeleksi keseimbangan putih manual.

private async void WbComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if(!_isPreviewing)
    {
        // Do not set white balance values unless the preview stream is running.
        return;
    }

    var selected = (ColorTemperaturePreset)WbComboBox.SelectedItem;
    WbSlider.IsEnabled = (selected == ColorTemperaturePreset.Manual);
    await _mediaCapture.VideoDeviceController.WhiteBalanceControl.SetPresetAsync(selected);

}

Di penanganan aktivitas ValueChanged , dapatkan nilai kontrol saat ini dan atur nilai keseimbangan putih dengan memanggil SetValueAsync.

private async void WbSlider_ValueChanged(object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e)
{
    if (!_isPreviewing)
    {
        // Do not set white balance values unless the preview stream is running.
        return;
    }

    var value = (sender as Slider).Value;
    await _mediaCapture.VideoDeviceController.WhiteBalanceControl.SetValueAsync((uint)value);
}

Penting

Menyesuaikan keseimbangan putih hanya didukung saat aliran pratinjau sedang berjalan. Periksa untuk memastikan bahwa aliran pratinjau berjalan sebelum mengatur nilai keseimbangan putih atau prasetel.

Penting

Nilai preset ColorTemperaturePreset.Auto menginstruksikan sistem untuk secara otomatis menyesuaikan tingkat keseimbangan putih. Untuk beberapa skenario, seperti menangkap urutan foto di mana tingkat keseimbangan putih harus sama untuk setiap bingkai, Anda mungkin ingin mengunci kontrol ke nilai otomatis saat ini. Untuk melakukan ini, panggil SetPresetAsync dan tentukan Prasetel manual dan jangan atur nilai pada kontrol menggunakan SetValueAsync. Ini akan menyebabkan perangkat mengunci nilai saat ini. Jangan mencoba membaca nilai kontrol saat ini lalu meneruskan nilai yang dikembalikan ke SetValueAsync karena nilai ini tidak dijamin benar.

Zoom

ZoomControl memungkinkan Anda mengatur tingkat pembesaran tampilan yang digunakan selama pengambilan foto atau video.

Contoh ini menggunakan kontrol Penggeser untuk menyesuaikan tingkat perbesar tampilan saat ini. Bagian berikut menunjukkan cara menyesuaikan zoom berdasarkan gerakan jepit pada layar.

<Slider Name="ZoomSlider" Grid.Row="0" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Stretch" ValueChanged="ZoomSlider_ValueChanged"/>
<TextBlock Grid.Row="1" HorizontalAlignment="Center" Text="{Binding ElementName=ZoomSlider,Path=Value}"/>

Periksa untuk melihat apakah perangkat pengambilan saat ini mendukung ZoomControl dengan memeriksa properti Yang didukung. Jika kontrol didukung, Anda dapat menampilkan dan mengaktifkan UI untuk fitur ini.

Nilai tingkat perbesar tampilan harus berada dalam rentang yang didukung oleh perangkat dan harus berupa kenaikan ukuran langkah yang didukung. Dapatkan nilai yang didukung untuk perangkat saat ini dengan memeriksa properti Min, Max, dan Step, yang digunakan untuk mengatur properti kontrol penggeser yang sesuai.

Atur nilai kontrol penggeser ke nilai ZoomControl saat ini setelah membatalkan pendaftaran penanganan aktivitas ValueChanged sehingga peristiwa tidak dipicu saat nilai diatur.

var zoomControl = _mediaCapture.VideoDeviceController.ZoomControl;

if (zoomControl.Supported)
{
    ZoomSlider.Visibility = Visibility.Visible;

    ZoomSlider.Minimum = zoomControl.Min;
    ZoomSlider.Maximum = zoomControl.Max;
    ZoomSlider.StepFrequency = zoomControl.Step;
    
    ZoomSlider.ValueChanged -= ZoomSlider_ValueChanged;
    ZoomSlider.Value = zoomControl.Value;
    ZoomSlider.ValueChanged += ZoomSlider_ValueChanged;
}
else
{
    ZoomSlider.Visibility = Visibility.Collapsed;
}

Di penanganan aktivitas ValueChanged, buat instans baru kelas Zoom Pengaturan, atur properti Nilai ke nilai kontrol penggeser zoom saat ini. Jika properti SupportedModes dari ZoomControl berisi ZoomTransitionMode.Smooth, itu berarti perangkat mendukung transisi yang lancar di antara tingkat zoom. Karena mode ini memberikan pengalaman pengguna yang lebih baik, Anda biasanya ingin menggunakan nilai ini untuk properti Mode objek Zoom Pengaturan.

Terakhir, ubah pengaturan zoom saat ini dengan meneruskan objek Zoom Pengaturan Anda ke metode Konfigurasi objek ZoomControl.

private void ZoomSlider_ValueChanged(object sender, Windows.UI.Xaml.Controls.Primitives.RangeBaseValueChangedEventArgs e)
{
    var level = (float)ZoomSlider.Value;
    var settings = new ZoomSettings { Value = level };

    var zoomControl = _mediaCapture.VideoDeviceController.ZoomControl;
    if (zoomControl.SupportedModes.Contains(ZoomTransitionMode.Smooth))
    {
        settings.Mode = ZoomTransitionMode.Smooth;
    }
    else
    {
        settings.Mode = zoomControl.SupportedModes.First();
    }

    zoomControl.Configure(settings);
}

Perbesar tampilan halus menggunakan gerakan mencubit

Seperti yang dibahas di bagian sebelumnya, pada perangkat yang mendukungnya, mode zoom halus memungkinkan perangkat penangkapan untuk transisi dengan lancar antara tingkat zoom digital, memungkinkan pengguna untuk secara dinamis menyesuaikan tingkat pembesaran tampilan selama operasi penangkapan tanpa transisi diskrit dan mengonsumsi. Bagian ini menjelaskan cara menyesuaikan tingkat pembesaran tampilan sebagai respons terhadap gerakan mencubit.

Pertama, tentukan apakah kontrol zoom digital didukung pada perangkat saat ini dengan memeriksa properti ZoomControl.Supported. Selanjutnya, tentukan apakah mode zoom halus tersedia dengan memeriksa ZoomControl.SupportedModes untuk melihat apakah mode tersebut berisi nilai ZoomTransitionMode.Smooth.

private bool IsSmoothZoomSupported()
{
    if (!_mediaCapture.VideoDeviceController.ZoomControl.Supported)
    {
        ShowMessageToUser("Digital zoom is not supported on this device.");
        return false;
    }

    var zoomModes = _mediaCapture.VideoDeviceController.ZoomControl.SupportedModes;

    if (!zoomModes.Contains(ZoomTransitionMode.Smooth))
    {
        ShowMessageToUser("Smooth zoom not supported");
        return false;
    }

    return true;
}

Pada perangkat yang diaktifkan multi-sentuhan, skenario umumnya adalah menyesuaikan faktor zoom berdasarkan gerakan mencubit dua jari. Atur properti ManipulationMode dari kontrol CaptureElement ke ManipulationModes.Scale untuk mengaktifkan gerakan mencubit. Kemudian, daftar untuk peristiwa ManipulationDelta yang dinaikkan ketika gerakan mencubit berubah ukuran.

private void RegisterPinchGestureHandler()
{
    if (!IsSmoothZoomSupported())
    {
        return;
    }

    // Enable pinch/zoom gesture for the preview control
    PreviewControl.ManipulationMode = ManipulationModes.Scale;
    PreviewControl.ManipulationDelta += PreviewControl_ManipulationDelta;
}

Di handler untuk peristiwa ManipulationDelta , perbarui faktor zoom berdasarkan perubahan gerakan pinch pengguna. Nilai ManipulationDelta.Scale mewakili perubahan skala gerakan jepitan sehingga peningkatan kecil dalam ukuran cubit adalah angka yang sedikit lebih besar dari 1,0 dan penurunan kecil dalam ukuran jepitan adalah angka yang sedikit lebih kecil dari 1,0. Dalam contoh ini, nilai kontrol zoom saat ini dikalikan dengan delta skala.

Sebelum mengatur faktor zoom, Anda harus memastikan bahwa nilainya tidak kurang dari nilai minimum yang didukung oleh perangkat seperti yang ditunjukkan oleh properti ZoomControl.Min . Selain itu, pastikan bahwa nilainya kurang dari atau sama dengan nilai ZoomControl.Max. Terakhir, Anda harus memastikan bahwa faktor zoom adalah kelipatan dari ukuran langkah zoom yang didukung oleh perangkat seperti yang ditunjukkan oleh properti Langkah . Jika faktor zoom Anda tidak memenuhi persyaratan ini, pengecualian akan dilemparkan saat Anda mencoba mengatur tingkat pembesaran tampilan pada perangkat pengambilan.

Atur tingkat pembesaran tampilan pada perangkat pengambilan dengan membuat objek Zoom Pengaturan baru. Atur properti Mode ke ZoomTransitionMode.Smooth lalu atur properti Nilai ke faktor zoom yang Anda inginkan. Terakhir, panggil ZoomControl.Configure untuk mengatur nilai zoom baru pada perangkat. Perangkat akan beralih dengan lancar ke nilai zoom baru.

private void PreviewControl_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    var zoomControl = _mediaCapture.VideoDeviceController.ZoomControl;

    // Example zoom factor calculation based on size of scale gesture
    var zoomFactor = zoomControl.Value * e.Delta.Scale;

    if (zoomFactor < zoomControl.Min) zoomFactor = zoomControl.Min;
    if (zoomFactor > zoomControl.Max) zoomFactor = zoomControl.Max;
    zoomFactor = zoomFactor - (zoomFactor % zoomControl.Step);

    var settings = new ZoomSettings();
    settings.Mode = ZoomTransitionMode.Smooth;
    settings.Value = zoomFactor;

    _mediaCapture.VideoDeviceController.ZoomControl.Configure(settings);

}