import?javax.imageio.ImageIO;
10年積累的做網(wǎng)站、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有瀍河免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
import?java.awt.image.BufferedImage;
import?java.io.ByteArrayInputStream;
import?java.io.ByteArrayOutputStream;
import?java.io.File;
import?java.io.IOException;
public?class?ImageUtils?{
public?static?void?main(String[]?args)?{
String?str?=?img2Binary("C:\\Users\\hny\\Desktop\\favicon.jpg");
System.out.println(str);
binary2Img("C:\\Users\\hny\\Desktop\\favicon2.jpg",?str);
}
/**
*?圖片轉(zhuǎn)二進(jìn)制字符串
*
*?@param?path?圖片路徑
*?@return
*/
public?static?String?img2Binary(String?path)?{
File?file?=?new?File(path);
if?(!file.exists())?{
return?null;
}
try?{
BufferedImage?bi?=?ImageIO.read(file);
ByteArrayOutputStream?baos?=?new?ByteArrayOutputStream();
String?suffix?=?getSuffix(path);
ImageIO.write(bi,?suffix,?baos);
byte[]?bytes?=?baos.toByteArray();
return?new?sun.misc.BASE64Encoder().encodeBuffer(bytes).trim();
}?catch?(IOException?e)?{
e.printStackTrace();
}
return?null;
}
/**
*?字符串轉(zhuǎn)圖片文件
*
*?@param?path??????圖片路徑
*?@param?imgBinary?圖片字符串
*/
public?static?void?binary2Img(String?path,?String?imgBinary)?{
try?{
File?file?=?new?File(path);
byte[]?bytes1?=?new?sun.misc.BASE64Decoder().decodeBuffer(imgBinary);
ByteArrayInputStream?bais?=?new?ByteArrayInputStream(bytes1);
BufferedImage?bi1?=?ImageIO.read(bais);
String?suffix?=?getSuffix(path);
ImageIO.write(bi1,?suffix,?file);
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
/**
*?獲取圖片后綴名
*
*?@param?path
*?@return
*/
private?static?String?getSuffix(String?path)?{
int?index?=?path.contains(".")???path.lastIndexOf(".")?:?-1;
if?(index??-1)?{
return?path.substring(index?+?1);
}
return?null;
}
}
1.將Image圖像文件存入到數(shù)據(jù)庫中
我們知道數(shù)據(jù)庫里的Image類型的數(shù)據(jù)是"二進(jìn)制數(shù)據(jù)",因此必須將圖像文件轉(zhuǎn)換成字節(jié)數(shù)組才能存入數(shù)據(jù)庫中.
要這里有關(guān)數(shù)據(jù)的操作略寫,我將一些代碼段寫成方法,方便直接調(diào)用.
//根據(jù)文件名(完全路徑)
public byte[] SetImageToByteArray(string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
int streamLength = (int)fs.Length;
byte[] image = new byte[streamLength];
fs.Read(image, 0, streamLength);
fs.Close();
return image;
}
//另外,在ASP.NET中通過FileUpload控件得到的圖像文件可以通過以下方法
public byte[] SetImageToByteArray(FileUpload FileUpload1)
{
Stream stream = FileUpload1.PostedFile.InputStream;
byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);
stream.Close();
return photo;
}
2.從SQL Server數(shù)據(jù)庫讀取Image類型的數(shù)據(jù),并轉(zhuǎn)換成bytes[]或Image圖像文件
//要使用SqlDataReader要加載using System.Data.SqlClient命名空間
//將數(shù)據(jù)庫中的Image類型轉(zhuǎn)換成byte[]
public byte[] SetImage(SqlDataReader reader)
{
return (byte[])reader["Image"];//Image為數(shù)據(jù)庫中存放Image類型字段
}
//將byte[]轉(zhuǎn)換成Image圖像類型
//加載以下命名空間using System.Drawing;/using System.IO;
using System.Data.SqlClient;*/
public Image SetByteToImage(byte[] mybyte)
{
Image image;
MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);
image = Image.FromStream(mymemorystream);
return image;
}
引用pdfbox jar包
PDDocument pdDocument = new PDDocument();
BufferedImage image = ImageIO.read(f);
int width = 612;
int height = 792;
PDPage pdPage = new PDPage(new PDRectangle(width, height));
pdDocument.addPage(pdPage);
PDImageXObject pdImageXObject = LosslessFactory.createFromImage(pdDocument, image);
PDPageContentStream contentStream = new PDPageContentStream(pdDocument, pdPage);
contentStream.drawImage(pdImageXObject, 0, 0, width, height);
contentStream.close();
pdDocument.save(srcPath + candidate + File.separator
+ f.getName().substring(0, f.getName().length() - 4) + ".pdf");
pdDocument.close();
Graphics2D這個類有一個drawImage(Image img, AffineTransform xform, ImageObserver obs)方法可以實現(xiàn)旋轉(zhuǎn)
關(guān)于圖像轉(zhuǎn)換的方式,實際上操作的是圖像的字節(jié)流。我的工作中遇到過將bmp文件壓縮為jpg以便于網(wǎng)絡(luò)傳輸?shù)恼n題。所以我這里重點介紹bmp轉(zhuǎn)為jpg的一個方法。
實際上,我更喜歡使用以前sun公司內(nèi)部使用的api提供的轉(zhuǎn)換方法,這里使用到了兩個很重要的類:
com.sun.image.codec.jpeg.JPEGCodec
com.sun.image.codec.jpeg.JPEGImageEncoder
需要注意的是,它們所屬的一個jar包不存在于編譯目錄下,但存在于運行目錄下,所以我們首先需要在jre文件下找到rt.jar并導(dǎo)入進(jìn)來以使得編譯通過。
我改寫了網(wǎng)上的一個轉(zhuǎn)換代碼,所得代碼如下:
此外,原sun公司開源的jar包jai_corec_1.1.3.jar也提供了圖片格式的轉(zhuǎn)碼方式,這里也提供了轉(zhuǎn)碼方式,僅供參考:
備注:親自嘗試,當(dāng)從jpg轉(zhuǎn)bmp時會轉(zhuǎn)很久很久時間(看不到盡頭),轉(zhuǎn)得的文件可以很大,所以建議不要使用。
重載渲染控件的paintComponent(Graphics g)方法.
設(shè)你當(dāng)前圖像實例為img,已初始化,需要旋轉(zhuǎn)的角度為ang
public void paintComponent(Graphics g){
super.paintCompoent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.rotate(-angle);
g2d.drawImage(img,0,0,this.getWidth(),this.getHeight(),null);
}
Graphics,Graphics2D 類中有對當(dāng)前描繪環(huán)境進(jìn)行仿射變換的方法,包括translate,scale,rotate,也可以直接設(shè)置仿射變換矩陣,利用這點就可以根據(jù)所需要的實現(xiàn)方式來進(jìn)行描繪.