Pokud ještě z jakéhokoliv důvodu ukládáš do databáze obrázky v base64, budeš řešit problém s převodem zpět pro jejich zobrazení.
Při prohledávání stackOverflow narazíte na mnoho návodů jak toto jednoduše provést, ale všechny u mě končily chybou. Důvod je velikostí dat k převodu - jednoduché návody s tímto nepočítají.
Pro převod takových souborů budeš potřebovat tento kód
private Byte[] HexToBin(string pHexString)
{
if (String.IsNullOrEmpty(pHexString)) {
return new Byte[0];
}
if (pHexString.Length % 2 != 0) {
throw new Exception("Hexstring must have an even length");
}
Byte[] bin = new Byte[pHexString.Length / 2];
int o = 0;
int i = 0;
for (; i < pHexString.Length; i += 2, o++)
{
switch (pHexString[i])
{
case '0': bin[o] = 0x00; break;
case '1': bin[o] = 0x10; break;
case '2': bin[o] = 0x20; break;
case '3': bin[o] = 0x30; break;
case '4': bin[o] = 0x40; break;
case '5': bin[o] = 0x50; break;
case '6': bin[o] = 0x60; break;
case '7': bin[o] = 0x70; break;
case '8': bin[o] = 0x80; break;
case '9': bin[o] = 0x90; break;
case 'A':
case 'a': bin[o] = 0xa0; break;
case 'B':
case 'b': bin[o] = 0xb0; break;
case 'C':
case 'c': bin[o] = 0xc0; break;
case 'D':
case 'd': bin[o] = 0xd0; break;
case 'E':
case 'e': bin[o] = 0xe0; break;
case 'F':
case 'f': bin[o] = 0xf0; break;
default: throw new Exception("Invalid character found during hex decode");
}
switch (pHexString[i + 1])
{
case '0': bin[o] |= 0x00; break;
case '1': bin[o] |= 0x01; break;
case '2': bin[o] |= 0x02; break;
case '3': bin[o] |= 0x03; break;
case '4': bin[o] |= 0x04; break;
case '5': bin[o] |= 0x05; break;
case '6': bin[o] |= 0x06; break;
case '7': bin[o] |= 0x07; break;
case '8': bin[o] |= 0x08; break;
case '9': bin[o] |= 0x09; break;
case 'A':
case 'a': bin[o] |= 0x0a; break;
case 'B':
case 'b': bin[o] |= 0x0b; break;
case 'C'
case 'c': bin[o] |= 0x0c; break;
case 'D':
case 'd': bin[o] |= 0x0d; break;
case 'E':
case 'e': bin[o] |= 0x0e; break;
case 'F':
case 'f': bin[o] |= 0x0f; break;
default: throw new Exception("Invalid character found during hex decode");
}
}
return bin;
}
Zobrazení takové fotografie poté takto:
public static BitmapSource GetImageStream(Image myImage)
{
var bitmap = new Bitmap(myImage);
IntPtr bmpPt = bitmap.GetHbitmap();
BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bmpPt,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
bitmapSource.Freeze();
return bitmapSource;
}
//...
if (reader["Image"] != DBNull.Value)
{
Byte[] byteBLOBData = (Byte[])reader["Image"];
string result = System.Text.Encoding.UTF8.GetString(byteBLOBData);
Byte[] binaryImage = HexToBin(result);
MemoryStream stream = new MemoryStream(binaryImage);
Image img = Image.FromStream(stream);
ImageXY.Source = GetImageStream(img);
}
červen 2018