2016-04-11 4 views
1

У меня есть программа базы данных, которая хранит изображения в SQL DB и считывает их обратно для отображения в приложении WPF. если я использую Jpeg-изображения, он отлично работает, но если я использую PNG-изображения, которые я хотел использовать, чтобы попытаться сохранить прозрачность (которая в любом случае исчезает при хранении), большинство изображений возвращается в коррумпированные.Файл PNG поврежден при чтении с SQL

это изображение, которое было выбрано

enter image description here

я затем сохранить его в БД, и добавить изображение в ListView

enter image description here

тогда, если я закрыть приложение и перезагрузите его, он вытаскивает изображение из db, вы можете увидеть, что он поврежден в списке.

enter image description here

, а затем, когда я его выбором, управление изображения также показывает порочное изображение

enter image description here

я храню изображение в коде с помощью объекта BitmapImage, и использовать это, чтобы установить изображение. source, а также преобразовать его в байт [] для сохранения в поле изображения в базе данных.

я преобразовать BitmapImage в Byte [] с помощью следующей строки

    command.Parameters.AddWithValue("@Image", ImageToByteArray(productImage.ProductImage)); 

и эти функции для преобразования в и из BitmapImage

 private static BitmapImage BuildImage(byte[] image) 
    { 
     var bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     MemoryStream mem = new MemoryStream(image); 
     bitmap.StreamSource = mem; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.EndInit(); 
     //bitmap.Freeze(); 

     return bitmap; 
    } 

    private static byte[] ImageToByteArray(BitmapImage image) 
    { 
     byte[] data; 
     JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(image)); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      encoder.Save(ms); 
      data = ms.ToArray(); 
     } 

     return data; 

    } 

прекрасно работает с JPEGS, но потом У меня есть белый фон для изображений.

любая помощь будет очень признательна.

+0

Какой язык программирования и СУБД вы используете? –

+0

Я предлагаю использовать varBinary как тип данных в SQL и поместить его в поток на C# и преобразовать его в String base64;) –

+0

Изображение просто BLOB для SQL Server. Он никак не влияет на данные и не изменяет их, поэтому проблема заключается в том, как вы храните и читаете его ... – gbn

ответ

1

Как личное предпочтение Я бы поменял ваш столбец данных SQL на varbinary (MAX) и использовал объекты stream и BinaryReader для загрузки файла.

Однако я думаю, что ваша проблема заключается в том, что вы не используете PngBitmapEncoder для PNG, который вы используете JpegBitmapEncoder, независимо от типа файла.

Надеюсь, это поможет.