poniedziałek, 5 maja 2014

WPF Canvas - Hexstring to image

Jak odczytać obrazek zapisany na przykład w MSSQL?
Można na dwa sposoby.

Pierwszy sposób polega na skopiowaniu z bazy hex stringu i wstawienie go do DrawImage(), który później za pomocą HexStringToBytes() jest konwertowany do byte[].

public void DrawImage(string hexvalue)
{
    canvas1.Children.Clear();
    byte[] byBitmap = HexStringToBytes(hexvalue);

Drugim sposobem jest połączenie się do bazy MSSQL z poziomu programu i wykonanie odpowiednich zapytań, aby odnieść się do komórki z naszym obrazkiem, tzw. Binary Data.
Tutaj już nie korzystamy z HexStringToBytes(), tylko po odpowiednim zapytaniu odwołujemy się do kolumny "pic", gdzie jest zapisany obrazek.

public void DrawImage()
{
    //Połączenie z bazą + zapytanie
    canvas1.Children.Clear();
    byte[] byBitmap = (byte[])result["pic"];


Poniższy przykład przedstawia narysowanie obrazku w canvas z hexstringu.

public void DrawImage(string hexvalue)
{
    canvas1.Children.Clear();
    byte[] byBitmap = HexStringToBytes(hexvalue);
    var Bitmap = ImageFromBuffer(byBitmap);

    Image NewImg = new Image();
            
    double maxX = canvas1.Width = Bitmap.Width;
    double maxY = canvas1.Height = Bitmap.Height;

    NewImg = new Image();
    NewImg.Source = Bitmap;
    NewImg.Width = Bitmap.Width;
    NewImg.Height = Bitmap.Height;
    Canvas.SetLeft(NewImg, 0);
    Canvas.SetTop(NewImg, 0);
    canvas1.Children.Add(NewImg);
}

public BitmapImage ImageFromBuffer(Byte[] bytes)
{
    MemoryStream stream = new MemoryStream(bytes);
    BitmapImage image = new BitmapImage();
    image.BeginInit();
    image.StreamSource = stream;
    image.EndInit();
    return image;
}

byte[] HexStringToBytes(string hex)
{
    return Enumerable.Range(0, hex.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                 .ToArray();
}