Bagikan melalui


WriteableBitmap Kelas

Definisi

BitmapSource Menyediakan yang dapat ditulis dan diperbarui.

public ref class WriteableBitmap sealed : System::Windows::Media::Imaging::BitmapSource
public sealed class WriteableBitmap : System.Windows.Media.Imaging.BitmapSource
type WriteableBitmap = class
    inherit BitmapSource
Public NotInheritable Class WriteableBitmap
Inherits BitmapSource
Warisan

Contoh

Contoh berikut menunjukkan bagaimana dapat WriteableBitmap digunakan sebagai sumber Image untuk menggambar piksel saat mouse bergerak.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Input;

namespace WriteableBitmapDemo
{
    class Program
    {
        static WriteableBitmap writeableBitmap;
        static Window w;
        static Image i;

        [STAThread]
        static void Main(string[] args)
        {
            i = new Image();
            RenderOptions.SetBitmapScalingMode(i, BitmapScalingMode.NearestNeighbor);
            RenderOptions.SetEdgeMode(i, EdgeMode.Aliased);
           
            w = new Window();
            w.Content = i;
            w.Show();

            writeableBitmap = new WriteableBitmap(
                (int)w.ActualWidth, 
                (int)w.ActualHeight, 
                96, 
                96, 
                PixelFormats.Bgr32, 
                null);

            i.Source = writeableBitmap;

            i.Stretch = Stretch.None;
            i.HorizontalAlignment = HorizontalAlignment.Left;
            i.VerticalAlignment = VerticalAlignment.Top;

            i.MouseMove += new MouseEventHandler(i_MouseMove);
            i.MouseLeftButtonDown += 
                new MouseButtonEventHandler(i_MouseLeftButtonDown);
            i.MouseRightButtonDown += 
                new MouseButtonEventHandler(i_MouseRightButtonDown);

            w.MouseWheel += new MouseWheelEventHandler(w_MouseWheel);

            Application app = new Application();
            app.Run();
        }

        // The DrawPixel method updates the WriteableBitmap by using
        // unsafe code to write a pixel into the back buffer.
        static void DrawPixel(MouseEventArgs e)
        {
            int column = (int)e.GetPosition(i).X;
            int row = (int)e.GetPosition(i).Y;

            try{
                // Reserve the back buffer for updates.
                writeableBitmap.Lock();

                unsafe
                {
                    // Get a pointer to the back buffer.
                    IntPtr pBackBuffer = writeableBitmap.BackBuffer;

                    // Find the address of the pixel to draw.
                    pBackBuffer += row * writeableBitmap.BackBufferStride;
                    pBackBuffer += column * 4;

                    // Compute the pixel's color.
                    int color_data = 255 << 16; // R
                    color_data |= 128 << 8;   // G
                    color_data |= 255 << 0;   // B

                    // Assign the color data to the pixel.
                    *((int*) pBackBuffer) = color_data;
                }
    
                // Specify the area of the bitmap that changed.
                writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1));
            }
            finally{
                // Release the back buffer and make it available for display.
                writeableBitmap.Unlock();
            }
        }

        static void ErasePixel(MouseEventArgs e)
        {
            byte[] ColorData = { 0, 0, 0, 0 }; // B G R

            Int32Rect rect = new Int32Rect(
                    (int)(e.GetPosition(i).X), 
                    (int)(e.GetPosition(i).Y), 
                    1, 
                    1);

            writeableBitmap.WritePixels( rect, ColorData, 4, 0);
        }

        static void i_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            ErasePixel(e);
        }

        static void i_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DrawPixel(e);
        }

        static void i_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                DrawPixel(e);
            }
            else if (e.RightButton == MouseButtonState.Pressed)
            {
                ErasePixel(e);
            }
        }

        static void w_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            System.Windows.Media.Matrix m = i.RenderTransform.Value;

            if (e.Delta > 0)
            {
                m.ScaleAt(
                    1.5, 
                    1.5, 
                    e.GetPosition(w).X, 
                    e.GetPosition(w).Y);
            }
            else
            {
                m.ScaleAt(
                    1.0 / 1.5, 
                    1.0 / 1.5, 
                    e.GetPosition(w).X, 
                    e.GetPosition(w).Y);
            }

            i.RenderTransform = new MatrixTransform(m);
        }
    }
}

Keterangan

WriteableBitmap Gunakan kelas untuk memperbarui dan merender bitmap berdasarkan per bingkai. Ini berguna untuk menghasilkan konten algoritma, seperti gambar fraktal, dan untuk visualisasi data, seperti visualisasi musik.

Kelas ini WriteableBitmap menggunakan dua buffer. Buffer belakang dialokasikan dalam memori sistem dan mengakumulasi konten yang saat ini tidak ditampilkan. Buffer depan dialokasikan dalam memori sistem dan berisi konten yang saat ini ditampilkan. Sistem penyajian menyalin buffer depan ke memori video untuk ditampilkan.

Dua utas menggunakan buffer ini. Utas antarmuka pengguna (UI) menghasilkan UI tetapi tidak menyajikannya ke layar. Utas UI merespons input pengguna, timer, dan peristiwa lainnya. Aplikasi dapat memiliki beberapa utas UI. Utas render menyusun dan merender perubahan dari utas UI. Hanya ada satu utas render per aplikasi.

Utas UI menulis konten ke buffer belakang. Utas render membaca konten dari buffer depan dan menyalinnya ke memori video. Perubahan pada buffer belakang dilacak dengan wilayah persegi panjang yang diubah.

Panggil salah WritePixels satu kelebihan beban untuk memperbarui dan menampilkan konten di buffer belakang secara otomatis.

Untuk kontrol yang lebih besar atas pembaruan, dan untuk akses multi-utas ke buffer belakang, gunakan alur kerja berikut.

  1. Lock Panggil metode untuk memesan buffer belakang untuk pembaruan.

  2. Dapatkan penunjuk ke buffer belakang dengan mengakses BackBuffer properti .

  3. Tulis perubahan pada buffer belakang. Utas lain dapat menulis perubahan pada buffer belakang saat WriteableBitmap dikunci.

  4. AddDirtyRect Panggil metode untuk menunjukkan area yang telah berubah.

  5. Unlock Panggil metode untuk melepaskan buffer belakang dan izinkan presentasi ke layar.

Ketika pembaruan dikirim ke utas penyajian, utas penyajian menyalin persegi panjang yang diubah dari buffer belakang ke buffer depan. Sistem penyajian mengontrol pertukaran ini untuk menghindari kebuntuan dan menggambar ulang artefak, seperti "merobek".

Konstruktor

WriteableBitmap(BitmapSource)

Menginisialisasi instans WriteableBitmap baru kelas menggunakan BitmapSource.

WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette)

Menginisialisasi instans WriteableBitmap baru kelas dengan parameter yang ditentukan.

Properti

BackBuffer

Mendapatkan penunjuk ke buffer belakang.

BackBufferStride

Mendapatkan nilai yang menunjukkan jumlah byte dalam satu baris data piksel.

CanFreeze

Mendapatkan nilai yang menunjukkan apakah objek dapat dibuat tidak dapat dimodifikasi.

(Diperoleh dari Freezable)
DependencyObjectType

Mendapatkan yang membungkus jenis CLR dari instans DependencyObjectType ini.

(Diperoleh dari DependencyObject)
Dispatcher

Dispatcher Mendapatkan ini DispatcherObject dikaitkan dengan.

(Diperoleh dari DispatcherObject)
DpiX

Mendapatkan titik horizontal per inci (dpi) gambar.

(Diperoleh dari BitmapSource)
DpiY

Mendapatkan titik vertikal per inci (dpi) gambar.

(Diperoleh dari BitmapSource)
Format

Mendapatkan asli PixelFormat data bitmap.

(Diperoleh dari BitmapSource)
HasAnimatedProperties

Mendapatkan nilai yang menunjukkan apakah satu atau beberapa AnimationClock objek dikaitkan dengan salah satu properti dependensi objek ini.

(Diperoleh dari Animatable)
Height

Mendapatkan tinggi bitmap sumber di unit independen perangkat (1/96 inci per unit).

(Diperoleh dari BitmapSource)
IsDownloading

Mendapatkan nilai yang menunjukkan apakah BitmapSource konten sedang diunduh.

(Diperoleh dari BitmapSource)
IsFrozen

Mendapatkan nilai yang menunjukkan apakah objek saat ini dapat dimodifikasi.

(Diperoleh dari Freezable)
IsSealed

Mendapatkan nilai yang menunjukkan apakah instans ini saat ini disegel (baca-saja).

(Diperoleh dari DependencyObject)
Metadata

Mendapatkan metadata yang terkait dengan gambar bitmap ini.

(Diperoleh dari BitmapSource)
Palette

Mendapatkan palet warna bitmap, jika ditentukan.

(Diperoleh dari BitmapSource)
PixelHeight

Mendapatkan tinggi bitmap dalam piksel.

(Diperoleh dari BitmapSource)
PixelWidth

Mendapatkan lebar bitmap dalam piksel.

(Diperoleh dari BitmapSource)
Width

Mendapatkan lebar bitmap dalam unit independen perangkat (1/96 inci per unit).

(Diperoleh dari BitmapSource)

Metode

AddDirtyRect(Int32Rect)

Menentukan area bitmap yang berubah.

ApplyAnimationClock(DependencyProperty, AnimationClock)

AnimationClock Menerapkan ke yang ditentukanDependencyProperty. Jika properti sudah dianimasikan, SnapshotAndReplace perilaku handoff digunakan.

(Diperoleh dari Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

AnimationClock Menerapkan ke yang ditentukanDependencyProperty. Jika properti sudah dianimasikan, yang ditentukan HandoffBehavior akan digunakan.

(Diperoleh dari Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Menerapkan animasi ke yang ditentukan DependencyProperty. Animasi dimulai ketika bingkai berikutnya dirender. Jika properti yang ditentukan sudah dianimasikan, SnapshotAndReplace perilaku handoff digunakan.

(Diperoleh dari Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Menerapkan animasi ke yang ditentukan DependencyProperty. Animasi dimulai ketika bingkai berikutnya dirender. Jika properti yang ditentukan sudah dianimasikan, properti yang ditentukan HandoffBehavior akan digunakan.

(Diperoleh dari Animatable)
CheckAccess()

Menentukan apakah utas panggilan memiliki akses ke ini DispatcherObject.

(Diperoleh dari DispatcherObject)
CheckIfSiteOfOrigin()

Memeriksa apakah konten sumber bitmap berasal dari situs asal yang diketahui. Metode ini digunakan untuk memastikan bahwa operasi penyalinan piksel aman.

(Diperoleh dari BitmapSource)
ClearValue(DependencyProperty)

Menghapus nilai lokal properti. Properti yang akan dibersihkan ditentukan oleh DependencyProperty pengidentifikasi.

(Diperoleh dari DependencyObject)
ClearValue(DependencyPropertyKey)

Menghapus nilai lokal properti baca-saja. Properti yang akan dibersihkan ditentukan oleh DependencyPropertyKey.

(Diperoleh dari DependencyObject)
Clone()

Membuat kloning yang dapat dimodifikasi dari ini WriteableBitmap, membuat salinan mendalam dari nilai objek ini. Saat menyalin properti dependensi, metode ini menyalin referensi sumber daya dan pengikatan data (tetapi mungkin tidak lagi diselesaikan) tetapi bukan animasi atau nilainya saat ini.

CloneCore(Freezable)

Menjadikan instans ini salinan mendalam dari yang ditentukan BitmapSource. Saat menyalin properti dependensi, metode ini menyalin referensi sumber daya dan pengikatan data (tetapi mungkin tidak lagi diselesaikan) tetapi bukan animasi atau nilainya saat ini.

(Diperoleh dari BitmapSource)
CloneCurrentValue()

Membuat klon yang dapat dimodifikasi dari objek ini ByteAnimationUsingKeyFrames , membuat salinan mendalam dari nilai objek ini saat ini. Referensi sumber daya, pengikatan data, dan animasi tidak disalin, tetapi nilainya saat ini.

CloneCurrentValueCore(Freezable)

Menjadikan instans ini salinan mendalam yang dapat dimodifikasi dari yang ditentukan BitmapSource menggunakan nilai properti saat ini. Referensi sumber daya, pengikatan data, dan animasi tidak disalin, tetapi nilainya saat ini.

(Diperoleh dari BitmapSource)
CoerceValue(DependencyProperty)

Memaksakan nilai properti dependensi yang ditentukan. Ini dicapai dengan memanggil fungsi apa pun CoerceValueCallback yang ditentukan dalam metadata properti untuk properti dependensi seperti yang ada pada panggilan DependencyObject.

(Diperoleh dari DependencyObject)
CopyPixels(Array, Int32, Int32)

Menyalin data piksel bitmap ke dalam array piksel dengan langkah yang ditentukan, dimulai dari offset yang ditentukan.

(Diperoleh dari BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Menyalin data piksel bitmap dalam persegi panjang yang ditentukan ke dalam array piksel yang memiliki langkah yang ditentukan dimulai pada offset yang ditentukan.

(Diperoleh dari BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Menyalin data piksel bitmap dalam persegi yang ditentukan.

(Diperoleh dari BitmapSource)
CreateInstance()

Menginisialisasi instans baru kelas Freezable.

(Diperoleh dari Freezable)
CreateInstanceCore()

Saat diimplementasikan di kelas turunan, membuat instans baru dari kelas turunan Freezable .

(Diperoleh dari Freezable)
Equals(Object)

Menentukan apakah yang disediakan DependencyObject setara dengan saat ini DependencyObject.

(Diperoleh dari DependencyObject)
Freeze()

Membuat objek saat ini tidak dapat dimodifikasi dan mengatur propertinya IsFrozen ke true.

(Diperoleh dari Freezable)
FreezeCore(Boolean)

Membuat instans BitmapSource atau kelas turunan tidak dapat diubah.

(Diperoleh dari BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Mengembalikan nilai non-animasi dari yang ditentukan DependencyProperty.

(Diperoleh dari Animatable)
GetAsFrozen()

Membuat salinan beku dari Freezable, menggunakan nilai properti dasar (non-animasi). Karena salinan dibekukan, sub-objek beku apa pun disalin oleh referensi.

(Diperoleh dari Freezable)
GetAsFrozenCore(Freezable)

Menjadikan instans ini sebagai klon objek yang ditentukan BitmapSource .

(Diperoleh dari BitmapSource)
GetCurrentValueAsFrozen()

Membuat salinan beku dari Freezable menggunakan nilai properti saat ini. Karena salinan dibekukan, sub-objek beku apa pun disalin oleh referensi.

(Diperoleh dari Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Menjadikan instans ini sebagai klon beku dari yang ditentukan BitmapSource. Referensi sumber daya, pengikatan data, dan animasi tidak disalin, tetapi nilainya saat ini.

(Diperoleh dari BitmapSource)
GetHashCode()

Mendapatkan kode hash untuk ini DependencyObject.

(Diperoleh dari DependencyObject)
GetLocalValueEnumerator()

Membuat enumerator khusus untuk menentukan properti dependensi mana yang memiliki nilai yang ditetapkan secara lokal pada ini DependencyObject.

(Diperoleh dari DependencyObject)
GetType()

Mendapatkan dari instans Type saat ini.

(Diperoleh dari Object)
GetValue(DependencyProperty)

Mengembalikan nilai efektif properti dependensi saat ini pada instans ini dari DependencyObject.

(Diperoleh dari DependencyObject)
InvalidateProperty(DependencyProperty)

Mengevaluasi kembali nilai efektif untuk properti dependensi yang ditentukan.

(Diperoleh dari DependencyObject)
Lock()

Mencadangkan buffer belakang untuk pembaruan.

MemberwiseClone()

Membuat salinan dangkal dari saat ini Object.

(Diperoleh dari Object)
OnChanged()

Dipanggil ketika objek saat ini Freezable dimodifikasi.

(Diperoleh dari Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Memastikan bahwa penunjuk konteks yang sesuai ditetapkan untuk DependencyObjectType anggota data yang baru saja ditetapkan.

(Diperoleh dari Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Anggota ini mendukung infrastruktur Windows Presentation Foundation (WPF) dan tidak dimaksudkan untuk digunakan langsung dari kode Anda.

(Diperoleh dari Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Mengambil alih DependencyObject implementasi OnPropertyChanged(DependencyPropertyChangedEventArgs) untuk juga memanggil penangan apa pun Changed sebagai respons terhadap properti dependensi yang berubah dari jenis Freezable.

(Diperoleh dari Freezable)
ReadLocalValue(DependencyProperty)

Mengembalikan nilai lokal properti dependensi, jika ada.

(Diperoleh dari DependencyObject)
ReadPreamble()

Memastikan bahwa Freezable sedang diakses dari utas yang valid. Pewaris Freezable harus memanggil metode ini di awal API apa pun yang membaca anggota data yang bukan properti dependensi.

(Diperoleh dari Freezable)
SetCurrentValue(DependencyProperty, Object)

Mengatur nilai properti dependensi tanpa mengubah sumber nilainya.

(Diperoleh dari DependencyObject)
SetValue(DependencyProperty, Object)

Mengatur nilai lokal properti dependensi, yang ditentukan oleh pengidentifikasi properti dependensinya.

(Diperoleh dari DependencyObject)
SetValue(DependencyPropertyKey, Object)

Mengatur nilai lokal properti dependensi baca-saja, yang ditentukan oleh DependencyPropertyKey pengidentifikasi properti dependensi.

(Diperoleh dari DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Mengembalikan nilai yang menunjukkan apakah proses serialisasi harus menserialisasikan nilai untuk properti dependensi yang disediakan.

(Diperoleh dari DependencyObject)
ToString()

Membuat representasi string objek ini berdasarkan budaya saat ini.

(Diperoleh dari ImageSource)
ToString(IFormatProvider)

Membuat representasi string objek ini berdasarkan yang IFormatProvider diteruskan. Jika penyedia adalah null, CurrentCulture digunakan.

(Diperoleh dari ImageSource)
TryLock(Duration)

Mencoba mengunci bitmap, menunggu tidak lebih dari lama waktu yang ditentukan.

Unlock()

Merilis buffer belakang untuk membuatnya tersedia untuk ditampilkan.

VerifyAccess()

Memberlakukan bahwa utas panggilan memiliki akses ke ini DispatcherObject.

(Diperoleh dari DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Updates piksel di wilayah bitmap yang ditentukan.

WritePixels(Int32Rect, Array, Int32, Int32, Int32)

Updates piksel di wilayah bitmap yang ditentukan.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Updates piksel di wilayah bitmap yang ditentukan.

WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32)

Updates piksel di wilayah bitmap yang ditentukan.

WritePostscript()

Menaikkan Changed peristiwa untuk Freezable dan memanggil metodenya OnChanged() . Kelas yang berasal dari Freezable harus memanggil metode ini di akhir API apa pun yang memodifikasi anggota kelas yang tidak disimpan sebagai properti dependensi.

(Diperoleh dari Freezable)
WritePreamble()

Memverifikasi bahwa Freezable tidak dibekukan dan sedang diakses dari konteks utas yang valid. Freezable pewaris harus memanggil metode ini di awal API apa pun yang menulis ke anggota data yang bukan properti dependensi.

(Diperoleh dari Freezable)

Acara

Changed

Terjadi ketika Freezable atau objek yang dikandungnya dimodifikasi.

(Diperoleh dari Freezable)
DecodeFailed

Terjadi ketika gambar gagal dimuat, karena header gambar yang rusak.

(Diperoleh dari BitmapSource)
DownloadCompleted

Terjadi ketika konten bitmap telah diunduh sepenuhnya.

(Diperoleh dari BitmapSource)
DownloadFailed

Terjadi ketika konten bitmap gagal diunduh.

(Diperoleh dari BitmapSource)
DownloadProgress

Terjadi ketika kemajuan pengunduhan konten bitmap telah berubah.

(Diperoleh dari BitmapSource)

Implementasi Antarmuka Eksplisit

IFormattable.ToString(String, IFormatProvider)

Memformat nilai instans saat ini menggunakan format yang ditentukan.

(Diperoleh dari ImageSource)

Berlaku untuk

Lihat juga