Stream | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar stream

HTML5 video element ile cihazın Camera görüntüsünü göstermek

20 April 2016 1 yorum

HTML5 ile birlikte gelen video element içerisinde navigator.getUserMedia API method’u sayesinde Javascript aracılığı ile cihazın Camera görüntüsünü gösterebiliyoruz.

Bu makale ile adım adım ilerleyerek, cihazın Camera gösüntüsünü video element içerisinde gösteren bir sayfa oluşturacağız, hemen yeni bir html dosyası oluşturalım ve içine aşağıdaki kodları yazalım;

Sayfaya bir video element ekleyeceğiz, Javascript aracılığı ile cihazın Camera görüntüsünü alacak, video element içerisinde göstereceğiz. Bunun için aşağıdaki kodları <body></body> element içerisine ekleyelim;

Böylece, sayfa açıldığında navigator nesnesinin getUserMedia method’unu kullanarak cihazın Camera görüntüsüne ulaşmayı deniyoruz.

Not : Eğer audio filtresine false değeri yerine true değeri verirsek sesleri de almaya başlarız.

Eğer camera‘ya başarılı bir şekilde erişebilirsek, window.URL.createObjectURL() methodu ile Camera‘nın görüntüsünü istediğimiz video element içerisinde oynatmaya başlayabiliyoruz.

Sayfa ilk açıldığında kullanıcıdan Camera‘ya erişmek için izin istenir.

Gerekli izin verildikten sonra Camera görüntüsü, ilgili video element içerisinde oynatılmaya başlanır.

Eğer Camera görüntüsünü durdurmak istiyorsak, stream‘in stop() methodunu çağırmamız yeterli.

Ayrıca, CSS3 stillerini kullanarak Camera görüntüsü üzerine efekt‘ler de uygulayabiliriz. Bakınız, HTML5 video element CSS3 ile efekt uygulamak

Eğer Camera görüntüsünün çözünürlüğünü değiştirmek istersek, navigator.getUserMedia() methodunun ilk parametresinde basitçe video: true yazmak yerine, istediğimiz çözünürlüğü aşağıdaki gibi belirtiyoruz;

Windows 8 uygulamasında seçilen resmin hakim rengini bulma

09 June 2015 Yorum yapılmamış

Uygulamalarımızda sıklıkla resimler kullanırız ve bir resimde hakim olan (en çok kullanılan) rengi bulmak ve uygulama içerisinde kullanabilmek çok faydalı olabilir.

Resmi hafızaya yükledikten sonra pixel pixel üzerinde gezip her pixel‘in değerlerini toplayıp ve ortalamasını alarak hakim rengi bulabiliriz. Fakat aşağıda kodlarını paylaşacağım yöntem ile bu işi çok daha hızlı ve az hafıza gerektiren bir şekilde gerçekleştirebiliriz.

Öncelikle hakim rengini bulacağımız resim dosyasını StorageFile sınıfının GetFileFromApplicationUriAsync() methodunu kullanarak bir değişkene alıyoruz;

var file = await StorageFile.GetFileFromApplicationUriAsync(imageUri);

Şimdi dosyayı açacak, BitmapDecoder nesnesi oluşturacak, resim dosyasını GetPixelDataAsync() methodunu kullanarak 1×1 boyuta boyutlandıracak, 1×1 boyutlu yeni resmin renk değerini okuyacağız;

using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
	var decoder = await BitmapDecoder.CreateAsync(stream);

	var transform = new BitmapTransform { ScaledHeight = 1, ScaledWidth = 1 };

	var pixels = await decoder.GetPixelDataAsync(
			BitmapPixelFormat.Rgba8,
			BitmapAlphaMode.Ignore,
			transform,
			ExifOrientationMode.IgnoreExifOrientation,
			ColorManagementMode.DoNotColorManage);

	var bytes = pixels.DetachPixelData();

	var dominantColor = Color.FromArgb(255, bytes[0], bytes[1], bytes[2]);
}

Örnek resim ile kullandığımızda aşağıdaki sonucu elde etmeliyiz;

Kaynak : #WinRT : how to easily get the dominant color of a picture

Windows Phone 8 uygulama arkaplan görselini Bing servislerinden almak

05 February 2014 1 yorum

Windows Phone 8 için geliştirdiğiniz uygulamanın veya Button, Image gibi nesnelerin arkaplan görselinin periyodik olarak değişmesini isteyebilirsiniz. Böylece uygulamanızın içerisinde sürekli olarak güncellenen bir bölüm oluşturabilirsiniz.

Microsoft‘un geliştirdiği arama motoru olan Bing, ana arama ekranının arkaplan görselini periyodik olarak arkaplan görselini değiştirir.

Öncelikle Bing‘in arkaplan görselini nasıl değiştirdiğini anlamamız lazım. Eğer Bing tarayıcınızda açıldıktan sonra yaptığı isteklere bakacak olursanız, http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine bir çağrı yaptığını görebilirsiniz.

Bu isteğin parametreleri;

format, bu parametre ile dönüş cevabının xml formatında olması sağlanıyor
idx, bu parametre ile Bing’in arkaplan görsellerinden kaçıncı sıradakinin alınacağı belirleniyor
n, bu parametre ile kaç görselin bilgisinin alınacağı belirleniyor

http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine yapacağımız istek ile Bing‘in ilk sıradaki arkaplan görsellerinin bilgilerini xml formatında elde edeceğiz.

Öncelikle MainPage.xaml dosyasını aşağıdaki gibi güncelleyelim;

<phone:PhoneApplicationPage
	x:Class="BingBackground.MainPage"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
	xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	FontFamily="{StaticResource PhoneFontFamilyNormal}"
	FontSize="{StaticResource PhoneFontSizeNormal}"
	Foreground="{StaticResource PhoneForegroundBrush}"
	SupportedOrientations="Portrait" Orientation="Portrait"
	shell:SystemTray.IsVisible="True">

	<StackPanel>
		<StackPanel.Background>
			<ImageBrush x:Name="imgBackground"></ImageBrush>
		</StackPanel.Background>
	</StackPanel>

</phone:PhoneApplicationPage>

Böylece StackPanel nesnesinin arkaplanını imgBackground isimli ImageBrush nesnesi ile güncelleyebileceğiz.

MainPage.xaml.cs dosyasında yeralan MainPage class’ının constructor‘ında LoadBackgroundImage() method’unu çağıralım. LoadBackgroundImage() method’unda WebClient sınıfından yeni bir örnek oluşturup http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 adresine istek yapacağız;

private async void LoadBackgroundImage()
{
	WebClient client = new WebClient();

	client.DownloadStringCompleted += (sender, e) =>
	{
		if (e.Error == null && !string.IsNullOrEmpty(e.Result))
		{
			var doc = XDocument.Parse(e.Result);

			var url = (from node in doc.Descendants("url") select node.Value).FirstOrDefault();

			var uri = new Uri("http://www.bing.com" + url);

			client.OpenReadCompleted += (s, args) =>
			{
				var image = new BitmapImage();
				image.SetSource(args.Result);

				imgBackground.ImageSource = image;
			};
			client.OpenReadAsync(uri);
		}
	};

	client.DownloadStringAsync(new Uri("http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1"));
}

DownloadStringAsync() method’unu kullanarak yaptığımız isteğin cevabını DownloadStringCompleted event’i ile alabiliyoruz. string tipindeki cevabın boş veya hatalı olmadığını kontrol ettikten sonra XDocument sınıfının static Parse() method’unu kullanarak parse ediyoruz.

url isimli element‘in içinde yeralan arkaplan görseli adresinin başına http://www.bing.com bilgisini ekliyoruz, böylece Bing‘in arkaplan görselinin adresini tam olarak elde ediyoruz.

Aynı WebClient değişkenini kullanarak tam adresini elde ettiğimiz görsel dosyasına ulaşmak için OpenReadAsync() method’unu çağırıyoruz ve cevabı OpenReadCompleted event’i ile elde ediyoruz.

OpenReadCompleted event’i içerisinde elde ettiğimiz Stream ile yeni bir BitmapImage nesnesini dolduruyoruz ve MainPage.xaml içerisinde tanımladığımız imgBackground nesnesinin görseli olarak belirliyoruz.

Böylece Bing‘in arkaplan görseli değiştikçe bizim uygulamamızda ilgili alanın görseli değişecektir.

Bu kodda ne yanlış var? – 9

20 August 2011 12 yorum

Geliştirmekte olduğumuz bir projede C:\ sürücüsünde bulunan OnemliDosya.xls dosyasını sıkışırmamız ve OnemliDosya.zip dosyasını oluşturmamız istendi.

Hemen arkasından sıkıştırdığımız dosyayı açmamız ve OnemliDosya.Yeni.xls dosyasını oluşturmamız bekleniyor.

Aşağıdaki method’ları bu görev için yazdık;

public static void Compress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream InputStream = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream OutputStream = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(OutputStream, CompressionMode.Compress);

	try
	{
		byte[] Buffer = new byte[InputStream.Length];
		InputStream.Read(Buffer, 0, Buffer.Length);
		ZipStream.Write(Buffer, 0, Buffer.Length);
	}
	finally
	{
		OutputStream.Close();
		InputStream.Close();
	}
}

public static void Decompress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream Input = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream Output = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(Input, CompressionMode.Decompress);

	try
	{
		int Data = ZipStream.ReadByte();
		while (Data > 0)
		{
			Output.WriteByte((byte)Data);
			Data = ZipStream.ReadByte();
		}
	}
	finally
	{
		Output.Close();
		Input.Close();
	}
}

Yazdığımız method’ları aşağıdaki gibi kullanıyoruz;

Compress("C:\\OnemliDosya.xls", "C:\\OnemliDosya.zip");
Decompress("C:\\OnemliDosya.zip", "C:\\OnemliDosya.Yeni.xls");

Kodumuzdan emin olmamıza rağmen, çalışmadığını farkediyoruz.

Sizce problem nedir ve nasıl düzeltilebilir?