Makale Özeti

Bu makalede, konuyla ilgili ilk makalemde tablomuzda oluşturduğumuz image veri türünden resimlerimizi sorgulamayı ve onları verdiğimiz genişlik ve yükseklikle tekrar boyutlandırma işlemini gerçekleştireceğiz.

Makale

SQL Server Binary Data - II

Bu makalede, konuyla ilgili ilk makalemde tablomuzda oluşturduğumuz image veri türünden resimlerimizi sorgulamayı ve onları verdiğimiz genişlik ve yükseklikle tekrar boyutlandırma işlemini gerçekleştireceğiz.

Sorgularken aynı zamanda şöyle bir işlem de yapacağız. Biz veritabanımıza eklediğimiz resimleri herzaman orjinal boyutlarıyla sunmayız. Bazen istediğimiz boyutlandırmayı uygulama içerisinde yapma gereği duyarız. Bu işlemi ASP Image kontrolü üzerinde yaparsak, resim yine tümüyle istemciye yüklenip, tekrar boyutlandırma uygulanır. Biz yapacağımız işlemde resimleri tekrar boyutlandırıp, yeni boyutlarıyla istemciye yollayacağız. Böylece performans açısından da bir kazancımız olacak.

Öncelikle ürün listeleyeceğimiz prosedürü hazırlıyoruz

CREATE PROCEDURE urunListele
AS
SELECT
* FROM Urunler

Burada hazırladığımız prosedür, bize eklediğimiz resmi binary formatında sunduğu için onu okurken de yazarken yaptığımız gibi dönüşüm uygulamamız gerekecek. Öncelikle ürünlerin listesini sunmak için web uygulaması açtık ve formumuza datalist kontrolü ekledik. asp.net kontrollerinde binary veriyi sunacak bir kontrol bulunmadığı için, bu dönüşümü bizim uygulayıp sunmamız gerekiyor. Bunun için öncelikle datalistimizi veriye bağlıyoruz.

Dim cmd As New SqlClient.SqlCommand

cmd.Connection = conn

cmd.CommandType = CommandType.StoredProcedure

cmd.CommandText = "urunListele"

conn.Open()

dlUrunler.DataSource = cmd.ExecuteReader

dlUrunler.DataBind()

conn.Close()

Şimdi HTML bölümüne geçip, datalist eleman şablonu üzerinde değişikliklerimizi yapacağız. Ürün adı ve ürün fiyatını  datalist üzerinde göstereceğimiz bağlantıyı yaptık. Ancak resimleri datalist üzerinde görüntüleyebilmek için kullanacağımız kontrol asp image kontrolü. Bu kontrol özelliklerinde ImageUrl yani görüntülecek resmin URL sini kaynak olarak alır. Burada bizim fiziksel bir dosyamız bulunmadığı için, bunu ayrı bir webform içerisinde outputstream olarak oluşturup, hazırladığımız datalistte bunu adres göstermemiz gerekiyor. Aşağıdaki datalist eleman şablonunda resim kolonu için Formatla adında bir fonksiyon kullanıldı. Bunun amacı da resmin çıktı olarak oluşturulacağı sayfayı burada adres göstermek ve bu sayfada da hangi ürünün resminin görüntüleneceğini göstermek.

<script language="vbscript" runat="server">
Function Formatla(str) as string
    Return ("resimoku.aspx?urunid=" & str)
End Function
</script>

<asp:DataList id="dlUrunler" runat="server" RepeatDirection="Horizontal" RepeatColumns="2">
<ItemTemplate>Adı:<asp:Label id="Label1" runat="server"><%#Container.DataItem("UrunAd")%></asp:Label>Fiyatı:<asp:Label id="Label2" runat="server"><%#Container.DataItem("UrunFiyat")%></asp:Label><asp:ImageButton id="ImageButton1" runat="server" ImageUrl=
'<%#Formatla(Container.DataItem("UrunID"))%>'></asp:ImageButton>
</ItemTemplate>
</asp:DataList>

Son olarak da bu resimoku.aspx web formu içerisinde yapılan resim tekrar boyutlandırma işlemine deyinip makalemi noktalayacağım.

Konuyla ilgili ilk makalemde, veri ekleme yaparken binary reader ile okuyup, veritabanına eklemiştik. Şimdi yapacağımız işlem de bu veriyi binary olarak okuyup, bu okunan veriyi sonuç çıktısına kaydetmek olacak. Bitmap nesnesini ilk yaratırken, genişlik ve yüksekliği de verip, bu verdiğimiz boyutlarda yeni bir bitmap yaratılmasını sağladık ve bu yaratılan bitmap'ın sonuç çıktısına kaydedilmesini sağladık.

Dim cmd As New SqlClient.SqlCommand

Dim dr As SqlClient.SqlDataReader

Dim data() As Byte

Dim str As System.IO.MemoryStream

Dim resim As Bitmap

Dim qStr As String

qStr = Request.QueryString("urunid")

If Not qStr Is Nothing Then

cmd.Connection = conn

cmd.CommandText = "SELECT UrunResim from Urunler WHERE UrunID=@UrunID"

cmd.Parameters.Add("@UrunID", qStr)

Else

Exit Sub

End If

conn.Open()

dr = cmd.ExecuteReader

If dr.HasRows Then

dr.Read()

data = dr.Item("UrunResim")

conn.Close()

Else

Exit Sub

End If

str = New System.IO.MemoryStream(data)

resim = New Bitmap(New System.Drawing.Bitmap(str), 50,50)

Response.ContentType = "image/jpeg"

resim.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)

Yeni bitmap  yaratılırken verilen genişlik ve yükseklik değerlerini değiştirip, oluşturulacak resmin genişlik ve yüksekliğinin değişmesini sağlayabilirsiniz.

Bu makalede, resimlerimizi sql server içerisinde depolamanın avantajlarından, depolama tekniğinden ve okunan resmin tekrar boyutlandırılmasından bahsettik.

Makale ile ilgili uygulama örneğine "Downloads" bölümünden erişebilirsiniz. Umarım faydalı olmuştur. Her türlü görüş ve önerileriniz için bana ulaşabilirsiniz

Volkan UÇARKAYA

vucarkaya@hotmail.com

 

Örnek Uygulama