C# 将图像数据类型转换为Base64,将Base64转换为图像数据类型

C# 将图像数据类型转换为Base64,将Base64转换为图像数据类型,c#,sql-server,base64,tobase64string,C#,Sql Server,Base64,Tobase64string,我在MS SQL 2012中使用数据类型Image来存储映像 问题:我有一个C中BASE64字符串的图像 /9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvY

我在MS SQL 2012中使用数据类型Image来存储映像

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

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2
我正在将其转换为C中的字节[],因为我需要将其保存到数据类型为IMAGE的列中。 像这样:

byte[] imageInByteArray =Convert.FromBase64String("MyImage");
已成功保存,如下所示:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw
SELECT CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@Image2"))', 'varbinary(max)')
 SELECT cast('' as xml).value('xs:base64Binary(sql:column("img"))', 'varchar(max)') FROM imageTemp WHERE...
数据库中的字节[]数组数据-

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

var imageA = results.Read<byte[]>().ToArray();
string imageB =Convert.ToBase64String(imageA);
结果不是我期望的结果应该是这样的

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

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

您可以创建如下所示的表。请注意,您可能不想创建数据库,只需要一个表就足够了。如果已经有一个表要保存此数据,则必须确保列的类型为varbinarymax

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

希望这有帮助。

回答您的问题

如何使用此字节[]数组从数据库检索base64

SQL Server将二进制文件嵌入XML时隐式转换为base64

试试这个

-我用一些伪内容填充一个二进制变量 将@SomeBinary VARBINARYMAX=CAST'This a dummy content'声明为VARBINARYMAX; -这是生成的二进制文件 选择@SomeBinary; -现在您可以看到使用FOR XML PATH会发生什么 选择@SomeBinary作为XML路径 我们可以很容易地将其重新转换

DECLARE @base64 VARCHAR(MAX)='VGhpcyBpcyBhIGR1bW15IGNvbnRlbnQ=';
SELECT CAST(@base64  AS XML).value('.','varbinary(max)');
可能您必须首先将CASTYourImageTypedColumn用作VARBINARYMAX


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

我使用下面的方法,将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);
    }
}

尊敬。

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

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

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw
SELECT CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@Image2"))', 'varbinary(max)')
 SELECT cast('' as xml).value('xs:base64Binary(sql:column("img"))', 'varchar(max)') FROM imageTemp WHERE...
并将其插入到图像列中

然后我在base64中检索到一个图像,如下所示:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw
SELECT CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@Image2"))', 'varbinary(max)')
 SELECT cast('' as xml).value('xs:base64Binary(sql:column("img"))', 'varchar(max)') FROM imageTemp WHERE...
它给了我之前发送的Base64字符串


谢谢。

您可以使用XML和XML路径提示将二进制文件转换为Base64

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

C代码

string base64Encoded = Convert.ToBase64String(((byte[])result.photoFromSQLImageColumn));
string base64Decoded;
byte[] data = System.Convert.FromBase64String(base64Encoded);
base64Decoded = System.Text.ASCIIEncoding.ASCII.GetString(data);
在这个变量中-->base64Decoded 您将拥有您的rigth base64字符串


来自墨西哥的问候

如果可以,我建议您使用varbinaryMAX。图像在SQL Server 2005中被弃用。嘿@Larnu,谢谢你的建议。但是我不能修改数据类型hello@shnugo,但是我没有得到与前面相同的base 64字符串。我首先将Base64字符串转换为C中的字节[],然后将其保存到数据库中的图像类型列中。现在我要检索我拥有的确切Base64字符串。@DivyaAgrawal您的意思是,您的二进制文件是Base64字符串,而不是表示图片的字节数组吗?请尝试将您的二进制列CASTyourBinaryColumn设置为VARCHARMAX,因为这会给我带来错误。不允许从数据类型image显式转换为varcharmax。@如上所述,您必须先转换为varbinarymax。请再次查看问题我已经编辑了它,可能是以前它不清楚。很抱歉,我没有得到它。这不是我正在寻找的解决办法。