如何顯示資料庫中以 OLE 對象方式儲存的 JPEG 圖片

來源:互聯網
上載者:User
對象|資料|資料庫|顯示 在 ASP 中, 我們經常需要在 Web 頁面上顯示以二進位方式儲存在資料庫中的圖片。 一般的圖片顯示沒有什麼問題, 因為這方面的文章已經很多了, 我就不再闡述。 但有時候資料庫中的圖片是通過其他辦公軟體輸入的, 或者通過其他方式, 比如在 Access 中直接添加。 這時, 圖片以 OLE 對象的方式儲存在資料庫中, 在圖片真實內容的前面, 還儲存了一些其他的資訊, 比如圖片的路徑和檔案名稱,等等。 如果我們還用一般的輸出方式的話, 就會出錯, 導致圖片不能顯示。

幸好 jpeg, bmp 等圖象格式中在圖片內容的開頭都有一個 SOI marker,這個 marker 對於 jpeg 來說是 FFD8, 而對於 bmp 是 424D. 這樣一來, 我們只要找到這個 marker 的位置, 就可以忽略前面的內容而直接從這裡開始輸出圖片。以 SQL server 為例,代碼如下:

<%
'-------------------------------------------------------------------------------------
' 函數:function ShowJpegField(field)
' 作者: inelm(Archimond【阿克蒙德】) from csdn
' Date: 2003-12-6 更新
' 功能: 取得儲存 jpeg 圖片的位元組數組中的 SOI marker 開始位置, 並從該位置輸出真正的圖片資訊
' 註: jpeg 格式的 SOI marker : FFD8
' bmp 格式:424D
' 參數: 圖片欄位
' 傳回值: 無
' 調用範例:ShowJpegField(rs("picture1"))
' 注意: 調用此函數之前, 需要先申明 response.write 的 MIME 類型為 "image/jpeg"
'-------------------------------------------------------------------------------------
function ShowJpegField(field)
dim size, i, j
'要輸出欄位的總位元組數
size = field.ActualSize

'迴圈找到 SOI marker 的位置
for i = 1 to size
if AscB(MidB(field, i, 1)) = &HFF and AscB(MidB(field, i + 1, 1)) = &HD8 then
exit for
end if
next

'忽略前面的無用資訊, 從 SOI marker 開始輸出真正的圖片資訊
for j = i to size
response.BinaryWrite MidB(field, j, 1)
next
end function
%>

<%
'-------- 主程式開始 ------------------------------
dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=123;Data Source=MARK")

sql = "select * from xinxi_mishuchu"
set rs = conn.execute(sql)

'聲明輸出類型, 清空輸出緩衝區
response.buffer = true
response.clear
response.ContentType = "image/jpeg"

'調用函數輸出圖片
ShowJpegField(rs("picture1"))

'打完收功!
rs.close : set rs = nothing
conn.close : set conn = nothing
%>

如果是其他格式的圖片, 如 bmp, gif 等, 輸出方法類似, 只不過是 SOI marker 不同而已。

由於作者水平有限, 錯誤之處在所難免,歡迎大家批評指正。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。