在任何一個綜合性網站
我們往往需要上傳一些圖片資料
但隨著高分辨率DC的普及
上傳的圖片容量會很大
比如
萬象素DC出來的文件基本不下
K
為了管理方便
大家可能不願意每次都用ACDsee修改它
而直接上傳到服務器
但是這種做法在客戶端看來就沒有那麼輕松了
對於撥號上網的用戶簡直是一場惡夢
雖然你可以在圖片區域設置wide和high!
問題的解決之道來了!我們可以在類中處理一張大圖
並縮小它
前提是需要JDK
這樣才能進行處理
按以下方法做
import java
io
File;
import java
io
FileOutputStream;
import java
awt
Graphics;
import java
awt
Image;
import java
awt
image
BufferedImage;
import dec
jpeg
JPEGCodec;
import dec
jpeg
JPEGImageEncoder;
public class JpgTest {
public void JpgTset() throws Exception{
File _file = new File(
/Order
jpg
); //讀入文件
Image src = javax
imageio
ImageIO
read(_file); //構造Image對象
int wideth=src
getWidth(null); //得到源圖寬
int height=src
getHeight(null); //得到源圖長
BufferedImage tag = new BufferedImage(wideth/
height/
BufferedImage
TYPE_INT_RGB);
tag
getGraphics()
drawImage(src
wideth/
height/
null); //繪制縮小後的圖
FileOutputStream out=new FileOutputStream(
newfile
jpg
); //輸出到文件流
JPEGImageEncoder encoder = JPEGCodec
createJPEGEncoder(out);
encoder
encode(tag); //近JPEG編碼
//System
out
print(width+
*
+height);
out
close();
}
}
過程很簡單
從本地磁盤讀取文件Order
jpg(
*
)
變成Image對象src
接著構造目標文件tag
設置tag的長寬為源圖的一半
對tag進行編碼
輸出到文件流out
最後關閉文件流
還有一些問題需要說明
第一
目前只能支持JPG(JPEG)
GIF
PNG三種格式
第二
對於源圖的容量有限制
最好不要超過
M
否則會拋內存不足的錯誤
不過我試驗過
M的源圖
可以成功
但是也很容易拋內存不足
引用一位前輩的話
圖象運算本身是密集型運算
需要大量的內存存放象素值
我用VC試了一下
M的圖象也有問題
而且越是壓縮比大的圖片在內存中還原成BITMAP時需要的內存越大
解決的方法
可以重寫編碼類
先開一定的內存
然後一段一段編碼寫到臨時文件中
輸出的時候再一段一段讀出來
或利用nio的內存映象來操作
JavaMail由於采用了Builder模式
先生成一個郵件的每一個部分
然後合並成一個完整的郵件對象
這樣每個構件都要先生成到內存中
你如果發送一個上百兆的附件
那麼在構造Part時肯定內存溢出
所以我就改寫了BodyPart的構造
讓他和一個臨時文件關聯
然後用臨時文件保存Part而不是構造在內存中
這樣任義大小的附件(硬盤能放得下為限)都可以發送了
最後
如果大家對圖像處理有更高的要求
不妨關注一下開源項目
比如JMagick
可以使用JMagick來實現圖片的復制
信息獲取
斜角
特效
組合
改變大小
加邊框
旋轉
切片
改變格式
去色等等功能
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25305.html