Преобразование типа данных Image в Base64 и Base64 в тип данных Image - PullRequest
0 голосов
/ 21 февраля 2019

Я использую тип данных "Изображение" в MS SQL 2012 для хранения изображения.

проблема: у меня есть изображение в строке BASE64 в C #

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

Я конвертируюэто в байт [] в C #, так как мне нужно сохранить его в столбце типа данных IMAGE.Примерно так:

byte[] imageInByteArray =Convert.FromBase64String("MyImage");

Успешно сохраняется следующим образом:

Данные массива байтов [] в базе данных -

enter image description here

Теперь я пытаюсь получить изображение и преобразовать его обратно в BASE64, используя это:

var imageA = results.Read<byte[]>().ToArray();
string imageB =Convert.ToBase64String(imageA);

Теперь я получаю такой результат:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw

результат не тот, который я ожидал, он должен быть таким

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

Ответы [ 4 ]

0 голосов
/ 07 марта 2019

Я нашел решение для этого, пожалуйста, посмотрите на это, потому что это может быть полезно, когда вы не хотите изменять свой тип данных Изображение в вашей базе данных:

Я отправил строку base64 в том виде, как она есть в базе данных, и тамЯ преобразовал его в varbinary следующим образом:

SELECT CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@Image2"))', 'varbinary(max)')

и вставил в столбец изображения.

, затем я получил изображение в base64, например:

 SELECT cast('' as xml).value('xs:base64Binary(sql:column("img"))', 'varchar(max)') FROM imageTemp WHERE...

Он дал мне точную строку Base64, которую я отправил ранее.

Спасибо.

0 голосов
/ 21 февраля 2019

Ответ на ваш вопрос

Как извлечь base64 из базы данных с помощью этого массива byte []?

SQL-сервер будет неявно преобразовывать ваш двоичный файл в base64 при его внедрениив XML.

Попробуйте это

--I fill a binary variable with some dummy content
DECLARE @SomeBinary VARBINARY(MAX) = CAST('This is a dummy content' AS VARBINARY(MAX));
--this is the resulting binary
SELECT @SomeBinary;
--Now you see what happens using FOR XML PATH
SELECT (SELECT @SomeBinary FOR XML PATH(''))

Мы можем легко преобразовать это

DECLARE @base64 VARCHAR(MAX)='VGhpcyBpcyBhIGR1bW15IGNvbnRlbnQ=';
SELECT CAST(@base64  AS XML).value('.','varbinary(max)');

Возможно, сначала вам придется использовать CAST(YourImageTypedColumn AS VARBINARY(MAX)).

Но может быть проще извлечь это как двоичный файл и преобразовать в ваше клиентское приложение.

0 голосов
/ 21 февраля 2019

Я использую этот метод ниже, чтобы преобразовать bytearray из базы данных в изображение.

public Bitmap ConvertByteArrayToBitmap(byte[] Array)
{
    if (Array == null) return null;

    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
    {
        ms.Write(Array, 0, Array.Length);
        ms.Position = 0L;

        return new Bitmap(ms);
    }
}

С уважением.

0 голосов
/ 21 февраля 2019

Я считаю, что вам нужна помощь о том, как хранить данные изображений на сервере SQL.

Вы можете создать таблицу, как показано ниже.Обратите внимание, что вы можете не захотеть создавать базу данных, достаточно таблицы.Если у вас уже есть таблица, в которой вы хотите сохранить эти данные, вам необходимо убедиться, что тип столбца - varbinary (max).

CREATE DATABASE MyDatabase;  
GO  
USE MyDatabase;  
GO  
CREATE TABLE MyImageDatabaseTable (Id int, BLOBData varbinary(max));  
GO  

Затем вы можете прочитать данные как:

SqlConnection objConn = new SqlConnection(connectionString);  
objConn.Open();  
SqlCommand objCmd = new SqlCommand("Select * From MyImageDatabaseTable", objConn);  
SqlDataReader dr = objCmd.ExecuteReader();  
while(dr.Read())
{
     byte[] myImageByteArrayData = (byte[]) dr["BLOBData"];  

     string myImageBase64StringData = Convert.ToBase64String(myImageByteArrayData );
}

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

...