将Image数据类型转换为Base64,并将Base64转换为Image数据类型

时间:2019-02-21 10:09:23

标签: c# sql-server base64 tobase64string

我正在使用MS SQL 2012中的数据类型“图像”来存储图像。

问题:我在C#中的BASE64字符串中有一个图像

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

我需要将其保存到数据类型为IMAGE的列中,并将其转换为C#中的byte []。 像这样:

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

成功保存如下:

数据库中的byte []数组数据-

enter image description here

现在,我正在尝试使用以下方法检索图像并将其转换回BASE64:

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

现在我得到这样的结果:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw

结果不是我期望的那样

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

6 个答案:

答案 0 :(得分:1)

我找到了解决方案,请仔细研究一下,因为当您不想更改数据库中的数据类型Image时,它可能会很有用:

我将base64字符串原样发送到数据库,然后将其转换为varbinary,如下所示:

ColorListPreset

并将其插入图片列。

然后我像这样在base64中检索图像:

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

它给了我之前发送的确切的Base64字符串。

谢谢。

答案 1 :(得分:0)

我相信您需要有关如何在sql server中存储图像数据的帮助。

您可以创建如下表。请注意,您可能不想创建数据库,仅一个表就足够了。如果您已经有一个要在其中保存此数据的表,则必须确保列的类型为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 );
}

希望这会有所帮助。

答案 2 :(得分:0)

回答您的问题

  

如何使用此byte []数组从数据库中检索base64?

SQL-Server将二进制文件嵌入XML时,会将其隐式转换为base64。

尝试一下

--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))

但是,以二进制形式检索此信息并在客户端应用程序上进行转换可能会更容易。

答案 3 :(得分:0)

下面,我使用此方法将字节数组从数据库转换为图像。

void loop() {
 unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
 previousMillis = currentMillis;
 mySerial.print("A"); 
 }
}

致谢。

答案 4 :(得分:0)

您可以使用XML和提示“ for xml path”将二进制文件转换为Base64

select file_name,ColumnWithBinary,ColumnToSwFinalResult
from TableWithBinary
cross apply (select ColumnWithBinary '*' for xml path('')) T (ColumnToSwFinalResult)
GO

enter image description here

答案 5 :(得分:0)

我明白了!

C#代码

string base64Encoded = Convert.ToBase64String(((byte[])result.photoFromSQLImageColumn));
string base64Decoded;
byte[] data = System.Convert.FromBase64String(base64Encoded);
base64Decoded = System.Text.ASCIIEncoding.ASCII.GetString(data);

并在此变量中-----> base64Decoded 您将拥有严格的base64字符串!

墨西哥的问候!!