導航:首頁 > 編程語言 > java圖片blob

java圖片blob

發布時間:2023-01-10 09:32:37

① 使用java語言操作,如何來實現MySQL中Blob欄位的存取

/**
* Title: BlobPros.java
* Project: test
* Description: 把圖片存入mysql中的blob欄位,並取出
* Call Mole: mtools資料庫中的tmp表
* File: C:downloadsluozsh.jpg
* Copyright: Copyright (c) 2003-2003
* Company: uniware
* Create Date: 2002.12.5
* @Author: ChenQH
* @version 1.0 版本*
*
* Revision history
* Name Date Description
* ---- ---- -----------
* Chenqh 2003.12.5 對圖片進行存取
*
* note: 要把資料庫中的Blob欄位設為longblob
*
*/

//package com.uniware;

import java.io.*;
import java.util.*;
import java.sql.*;

public class BlobPros
{
private static final String URL = "jdbc:mysql://10.144.123.63:3306/mtools?user=wind&password=123&useUnicode=true";
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
private File file = null;

public BlobPros()
{
}

/**
* 向資料庫中插入一個新的BLOB對象(圖片)
* @param infile 要輸入的數據文件
* @throws java.lang.Exception
*/
public void blobInsert(String infile) throws Exception
{
FileInputStream fis = null;
try
{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);

file = new File(infile);
fis = new FileInputStream(file);
//InputStream fis = new FileInputStream(infile);
pstmt = conn.prepareStatement("insert into tmp(descs,pic) values(?,?)");
pstmt.setString(1,file.getName()); //把傳過來的第一個參數設為文件名
//pstmt.setBinaryStream(2,fis,(int)file.length()); //這種方法原理上會丟數據,因為file.length()返回的是long型
pstmt.setBinaryStream(2,fis,fis.available()); //第二個參數為文件的內容
pstmt.executeUpdate();
}
catch(Exception ex)
{
System.out.println("[blobInsert error : ]" + ex.toString());
}
finally
{
//關閉所打開的對像//
pstmt.close();
fis.close();
conn.close();
}
}

/**
* 從資料庫中讀出BLOB對象
* @param outfile 輸出的數據文件
* @param picID 要取的圖片在資料庫中的ID
* @throws java.lang.Exception
*/

public void blobRead(String outfile,int picID) throws Exception
{
FileOutputStream fos = null;
InputStream is = null;
byte[] Buffer = new byte[4096];

try
{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(URL);
pstmt = conn.prepareStatement("select pic from tmp where id=?");
pstmt.setInt(1,picID); //傳入要取的圖片的ID
rs = pstmt.executeQuery();
rs.next();

file = new File(outfile);
if(!file.exists())
{
file.createNewFile(); //如果文件不存在,則創建
}
fos = new FileOutputStream(file);
is = rs.getBinaryStream("pic");
int size = 0;
/* while(size != -1)
{
size = is.read(Buffer); //從資料庫中一段一段的讀出數據
//System.out.println(size);
if(size != -1) //-1表示讀到了文件末
fos.write(Buffer,0,size);
} */
while((size = is.read(Buffer)) != -1)
{
//System.out.println(size);
fos.write(Buffer,0,size);
}

}
catch(Exception e)
{
System.out.println("[OutPutFile error : ]" + e.getMessage());
}
finally
{
//關閉用到的資源
fos.close();
rs.close();
pstmt.close();
conn.close();
}
}

public static void main(String[] args)
{
try
{

BlobPros blob = new BlobPros();
//blob.blobInsert("C:Downloadsluozsh1.jpg");
blob.blobRead("c:/downloads/1.jpg",47);
}
catch(Exception e)
{
System.out.println("[Main func error: ]" + e.getMessage());
}
}
}

② java blob

java blob是什麼,讓我們一起了解一下?

Blob是計算機視覺圖像中的一塊連通區域,Blob分析的就是對前景或背景分離後的二值圖像,進行連通域提取和標記以及計算Blob的一些相關特徵,而且通過Blob提取,還可以獲得相關區域的信息。

Blob分析的重要一個步驟是連通區域的確定,那麼它的優缺點是什麼?

優點:

Blob在目標跟蹤的優勢有:

1、通過Blob提取,可以獲得相關區域的信息,這些信息可以作為邊緣監測器或者角點檢測器的補充信息。在目標識別中,Blob可以提供局部的統計信息和外貌信息,這些信息能夠為目標識別和跟蹤提供依據。

2、可以利用Blob對直方圖進行峰值檢測。

3、Blob還可以作為紋理分析和紋理識別的基元。

4、通過Blob分析,可以得到目標的個數及其所在區域,在進行目標匹配時,不需要對全局圖像進行搜索。

缺點:

1、速度過慢,要整個區域作逐點掃描。

2、Blob分析難度大。這是一純幾何學上的問題,一個不規則的形狀,如何計算它的面積、大小沒有簡單易行的演算法,太過復雜,運算時間就長,速度就更慢了。

3、實際應用。Blob演算法在實際應用中,非常依賴光源。幾乎可以說,Blob演算法如果離開了一個可靠的光源設計,則完全不起作用。

那麼java是怎樣對Blob讀寫的?示例如下:
package com.you.sister;   import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties;   public class BlobTest {   public static Connection conn; public static Connection getConn() throws Exception { FileInputStream fis = new FileInputStream(new File("jdbc.properties")); Properties prop = new Properties(); prop.load(fis); String driver = prop.getProperty("jdbc.driver"); String url = prop.getProperty("jdbc.url"); String username = prop.getProperty("jdbc.username"); String password = prop.getProperty("jdbc.password"); Class.forName(driver); return  DriverManager.getConnection(url, username, password); } public static void main(String[] args) throws Exception { conn = getConn(); readBlob(); writeBlob(); conn.close(); } /** * 從資料庫中讀大對象出來 * 保存在本地 */ public static void readBlob() { try { String readSql = "select * from emp where empno = ?"; PreparedStatement ps = conn.prepareStatement(readSql); ps.setInt(1, 7369); ResultSet rs = ps.executeQuery(); while (rs.next()) { Blob image = rs.getBlob("image"); DataOutputStream dos =  // 在FileOutputStream中指定文件輸出路徑 new DataOutputStream(new FileOutputStream(7369 + "_image.jpeg")); InputStream fis = image.getBinaryStream(); int out; byte[] outByte = new byte [100]; // 將blob對象輸入流寫入本地輸出流中 while ((out = fis.read(outByte)) != -1) { dos.write(outByte); } fis.close(); dos.flush(); dos.close(); } rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 將大對象文件保存進資料庫中 */ public static void writeBlob() { try { BufferedInputStream fis =  new BufferedInputStream(new FileInputStream(new File("D:\\Tulips.jpg"))); // 如果是新插入欄位,則將大對象對應欄位插入為empty_clob(); // 如果是修改,則可以先update 該行數據,將大對象對應欄位設置為empty_clob(); String writeSql = "select * from emp where empno = ? for update"; PreparedStatement ps = conn.prepareStatement(writeSql); ps.setInt(1, 7499); conn.setAutoCommit(false); ResultSet rs = ps.executeQuery(); while (rs.next()) { oracle.sql.BLOB image = (oracle.sql.BLOB)rs.getBlob("image"); BufferedOutputStream bos = new BufferedOutputStream(image.getBinaryOutputStream()); int c; // 將實際文件中的內容以二進制的形式來輸出到blob對象對應的輸出流中 while ((c = fis.read()) != -1) { bos.write(c); } fis.close(); bos.close(); } conn.commit(); rs.close(); ps.close(); } catch (Exception e) { e.printStackTrace(); } } }

③ java中多張blob圖片如何在前台預覽,要求這些圖片同時顯示,最好有代碼

//您好,提問者:

比如您後台查詢的是個List集合數組,前台接受。

List<String>list=newArrayList<String>();//import你懂的
list.add("D:\xx.jpg");//我不是查詢資料庫,手動添加圖片地址,你也懂的
list.add("D:\xx1.jpg");
//這個時候如果struts2的話list是public有setget的話肯定前台能拿到
//如果不是就放到request.setAttribute("list",list);中

這下面是頁面代碼:

<%
Listlist=request.getAttribute("list");
for(inti=0;i<list.size();i++){%>
<imgsrc="<%=list.get(i)%>"/>
<%}%>

④ 用JAVA怎樣將保存在資料庫BLOB類型的圖片取出來轉換為圖片然後在頁面展示啊

呵呵,這個是沒有辦法接受哦。
request.setCharacterEncoding("UTF-8");
response.setContentType("image/jpeg");
response.getOutputStream().write(bytes);
這幾個參數是把這個圖片直接發給瀏覽器,說白了就直接把圖片當成文件讓瀏覽器下載。
解決辦法:
<img border=0 src="localhost:8080/Pic" />
localhost:8080是你配置WEB.XML
Pic是你的Servlet類名。

⑤ java如何把圖片轉換成二進制並存到oracle的blob中,求代碼

importjavax.imageio.ImageIO;
importjava.awt.image.BufferedImage;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.File;
importjava.io.IOException;


publicclassImageUtils{

publicstaticvoidmain(String[]args){
Stringstr=img2Binary("C:\Users\hny\Desktop\favicon.jpg");
System.out.println(str);
binary2Img("C:\Users\hny\Desktop\favicon2.jpg",str);
}

/**
*圖片轉二進制字元串
*
*@parampath圖片路徑
*@return
*/
publicstaticStringimg2Binary(Stringpath){
Filefile=newFile(path);
if(!file.exists()){
returnnull;
}

try{
BufferedImagebi=ImageIO.read(file);
ByteArrayOutputStreambaos=newByteArrayOutputStream();
Stringsuffix=getSuffix(path);
ImageIO.write(bi,suffix,baos);
byte[]bytes=baos.toByteArray();

returnnewsun.misc.BASE64Encoder().encodeBuffer(bytes).trim();
}catch(IOExceptione){
e.printStackTrace();
}
returnnull;
}

/**
*字元串轉圖片文件
*
*@parampath圖片路徑
*@paramimgBinary圖片字元串
*/
publicstaticvoidbinary2Img(Stringpath,StringimgBinary){
try{
Filefile=newFile(path);

byte[]bytes1=newsun.misc.BASE64Decoder().decodeBuffer(imgBinary);
ByteArrayInputStreams=newByteArrayInputStream(bytes1);
BufferedImagebi1=ImageIO.read(s);
Stringsuffix=getSuffix(path);
ImageIO.write(bi1,suffix,file);
}catch(IOExceptione){
e.printStackTrace();
}
}

/**
*獲取圖片後綴名
*
*@parampath
*@return
*/
privatestaticStringgetSuffix(Stringpath){
intindex=path.contains(".")?path.lastIndexOf("."):-1;
if(index>-1){
returnpath.substring(index+1);
}
returnnull;
}
}

⑥ java資料庫中blob欄位插入圖片的問題

ORACLE好像不支持blob存多個值,你可以另外建立一張表叫image_tab兩個欄位一個是主鍵id,還有一個就是image(blob只存一張圖片信息).然後你這張表欄位中存image_tab的主鍵,如果有多個可以這樣1,2,3...用逗號隔開。

⑦ java提取資料庫中blob類型的圖片,如何全部顯示在jsp頁面

在OracleQueryBean類中增加一個函數,來進行讀取,具體代碼如下:
/**
* 根據圖片在資料庫中的ID進行讀取
* @param strID 圖片欄位ID
* @param w 需要縮到的寬度
* @param h 需要縮到高度
* @return
*/
public byte[] GetImgByteById(String strID, int w, int h){
//System.out.println("Get img data which id is " + nID);
if(myConnection == null)
this.getConnection();
byte[] data = null;
try {
Statement stmt = myConnection.createStatement();
ResultSet myResultSet = stmt.executeQuery("select " + this.strIDName + " from " + this.strTabName + " where " + this.strIDName + "=" + strID);

StringBuffer myStringBuffer = new StringBuffer();
if (myResultSet.next()) {
java.sql.Blob blob = myResultSet.getBlob(this.strImgName);
InputStream inStream = blob.getBinaryStream();
try {
long nLen = blob.length();
int nSize = (int) nLen;
//System.out.println("img data size is :" + nSize);
data = new byte[nSize];
inStream.read(data);
inStream.close();
} catch (IOException e) {
System.out.println("獲取圖片數據失敗,原因:" + e.getMessage());
}

data = ChangeImgSize(data, w, h);
}
System.out.println(myStringBuffer.toString());
myConnection.commit();
myConnection.close();
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
return data;
}

頁面使用OracleQueryBean來根據用戶提供的圖片id進行查詢,在讀取並進行縮放後,通過jsp頁面進行展示,具體代碼如下:

<%@ page language="java" contentType="text/html;;charset=gbk" %>
<jsp:useBean id="OrcleQuery" scope="page" class="HLFtiDemo.OracleQueryBean" />
<%
response.setContentType("image/jpeg");
//圖片在資料庫中的 ID
String strID = request.getParameter("id");
//要縮略或放大圖片的寬度
String strWidth = request.getParameter("w");
//要縮略或放大圖片的高度
String strHeight = request.getParameter("h");
byte[] data = null;
if(strID != null){
int nWith = Integer.parseInt(strWidth);
int nHeight = Integer.parseInt(strHeight);
//獲取圖片的byte數據
data = OrcleQuery.GetImgByteById(strID, nWith, nHeight);
ServletOutputStream op = response.getOutputStream();
op.write(data, 0, data.length);
op.close();
op = null;
response.flushBuffer();
//清除輸出流,防止釋放時被捕獲異常
out.clear();
out = pageContext.pushBody();
}
%>

閱讀全文

與java圖片blob相關的資料

熱點內容
上門正骨用什麼app 瀏覽:756
安卓為什麼免費使用 瀏覽:397
加密貨幣都有哪些平台 瀏覽:625
python和matlab難度 瀏覽:388
python爬蟲很難學么 瀏覽:572
小米解壓積木可以組成什麼呢 瀏覽:816
為什麼滴滴出行app還能用 瀏覽:564
怎麼升級手機android 瀏覽:922
php權威編程pdf 瀏覽:994
扣扣加密技巧 瀏覽:720
蘋果如何創建伺服器錯誤 瀏覽:496
軟考初級程序員大題分值 瀏覽:474
js壓縮視頻文件 瀏覽:578
linux如何通過命令創建文件 瀏覽:991
應用加密app還能訪問應用嘛 瀏覽:435
安卓怎麼用支付寶交違章罰款 瀏覽:667
php面向對象的程序設計 瀏覽:506
數據挖掘演算法書籍推薦 瀏覽:895
投訴聯通用什麼app 瀏覽:152
web伺服器變更ip地址 瀏覽:956