簡體   English   中英

將 Image 數據類型轉換為 Base64,將 Base64 轉換為 Image 數據類型

[英]Convert Image data type into Base64 and Base64 into Image data type

我在 MS SQL 2012 中使用數據類型“圖像”來存儲圖像。

問題:我在 C# 中的 BASE64 字符串中有一個圖像

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

我將它轉換為 C# 中的 byte[],因為我需要將它保存到數據類型為 IMAGE 的列中。 像這樣:

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

保存成功如下:

數據庫中的 byte[] 數組數據 -

在此處輸入圖片說明

現在我正在嘗試使用以下方法檢索圖像並將其轉換回 BASE64:

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

現在我得到這樣的結果:

MHhGRkQ4RkZFMTAwNTg0NTc4Njk2NjAwMDA0RDREMDAyQTAwMDAwMDA4MDAwNDg3NjkwMDA0MDAwMDAwMDEwMDAwMDAzRTAxMTIw

結果不是我所期望的它應該是這樣的

/9j/4AAQSkZJRgABAQEASABIAAD/4SKhRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAALcbAAAAnEAAtxsAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNjowMjowNSAxNDo1MTo0MwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFUKADAAQAAAABAAACWAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAACFrAAAAAAAAAEgAAAABAAAASAAAAAH/2

我找到了解決方案,請查看此問題,因為當您不想更改數據庫中的數據類型 Image 時,它​​可能很有用:

我將 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 字符串。

謝謝你。

我相信您需要有關如何在 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 );
}

希望這可以幫助。

回答你的問題

如何使用這個 byte[] 數組從數據庫中檢索 base64?

將二進制文件嵌入到 XML 中時,SQL-Server 會將其隱式轉換為 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))

但是,將其作為二進制文件檢索並在客戶端應用程序上進行轉換可能更容易。

我在下面使用這種方法,將 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);
    }
}

問候。

您可以使用 XML 和“for xml path”提示將二進制文件轉換為 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 中,您將擁有正確的 base64 字符串!!

來自墨西哥的問候!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM