WPF kontrollerinin görüntüsünü dosya olarak diske kaydetmek...

0 dakikada yazıldı

5747 defa okundu

Düzenle

Bugün karşılaştığım bir sorunun çözümünü sizinle paylaşmak istiyorum.
Hazırladığım bir WPF uygulamasında ekranda bir şeyler çizdiriyordum ve
sonrasında bu çizimin bir JPEG olarak kaydedilmesini sağlamam
gerekiyordu. GDI'a girişerek tekrardan herşeyi bir BitmapImage içerisine
çizdirmek istemedim :( Zaten baktığınızda WPF uygulamalarında varsayılan
sınıflar arasında System.Drawing gelmiyor, ek olarak referans almak
gerekiyor.

Peki nasıl halledebiliriz bu işi?

Aslında çözüm epey kolay. Ekranda görsel olarak gösterebildiğiniz
herhangi bir Visual nesnesinin görselliğini alarak rahatlıkla diske bir
Encoder aracılığı ile kaydedebiliyorsunuz.

[VB]

        Dim Genislik As Integer
= 500

        Dim Yukseklik As Integer
= 640

 

        'Genişlik, Yükseklik, Yatay ve Dikey
DPI, Renk Derinliği verilir.

        Dim MyRender As New
RenderTargetBitmap(Genislik, Yukseklik, 96, 96, PixelFormats.Pbgra32)

        'Görseli alınacak nesne Render
metoduna verilir.

        MyRender.Render(Me)

 

        Dim Dosya As String
= "C:\1.jpg"

 

        'İstenirse GifBitmapEncoder veya
PngBitmapEncoder kullanılabilir.

        Dim Encoder As BitmapEncoder = New JpegBitmapEncoder()

        Encoder.Frames.Add(BitmapFrame.Create(MyRender))

 

        Using BirStream As System.IO.Stream =
System.IO.File.Create(Dosya)

            Encoder.Save(BirStream)

        End Using

[C#]

            int Genislik = 500;

            int Yukseklik = 640;

 

            //Genişlik, Yükseklik, Yatay ve
Dikey DPI, Renk Derinliği verilir.

            RenderTargetBitmap
MyRender = new RenderTargetBitmap(Genislik, Yukseklik,
96, 96, PixelFormats.Pbgra32);

            //Görseli alınacak nesne Render
metoduna verilir.

            MyRender.Render(this);

 

            string Dosya = "C:\\1.jpg";

 

            //İstenirse GifBitmapEncoder
veya PngBitmapEncoder kullanılabilir.

            BitmapEncoder Encoder =
new JpegBitmapEncoder();

            Encoder.Frames.Add(BitmapFrame.Create(MyRender));

 

            using (System.IO.Stream BirStream = System.IO.File.Create(Dosya))

            {

                Encoder.Save(BirStream);

            }

Kod içerisinde yazdığım açıklamalar sanırım detaylar için yeterli
olacaktır. RenderTargetBitmap sınıfından aldığımız instance'ın
Render metoduna verdiğimiz Visual tipindeki herhangi bir
nesnenin görselliğini alarak istediğimiz bir Encoder tipi ile Encode
edip diske rahatlıkla kaydedebiliyoruz.

Hepinize kolay gelsin.