Ⅰ java:Image和BufferedImage的區別是什麼
Image是一個抽象類,BufferedImage是Image的實現類。
Image和BufferedImage的主要作用就是將一副圖片載入到內存中。
BufferedImage 子類描述具有可訪問圖像數據緩沖區的 Image。BufferedImage 由圖像數據的 ColorModel 和 Raster 組成。Raster 的 SampleModel 中 band 的數量和類型必須與 ColorModel 所要求的數量和類型相匹配,以表示其顏色和 alpha 分量。所有 BufferedImage 對象的左上角坐標都為 (0, 0)。因此,用來構造 BufferedImage 的任何 Raster 都必須滿足:minX=0 且 minY=0。
Java將一副圖片載入到內存中的方法是:
String imgPath = "D://demo.bmp";
BufferedImage image = ImageIO.read(new FileInputStream(imgPath));
該方法BufferedImage 可以獲得圖片的詳細信息,例如:獲得圖片的寬度:image.getWidth(null);圖片只有載入內存中才能對圖片進行進一步的處理。
Ⅱ java上傳圖片 生成縮略圖,如果上傳的圖片尺寸比較小就壓縮處理
//將圖按比例縮小。
public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
// targetW,targetH分別表示目標長和寬
int type = source.getType();
BufferedImage target = null;
double sx = (double) targetW / source.getWidth();
double sy = (double) targetH / source.getHeight();
//這里想實現在targetW,targetH范圍內實現等比縮放。如果不需要等比縮放
//則將下面的if else語句注釋即可
if(sx>sy)
{
sx = sy;
targetW = (int)(sx * source.getWidth());
}else{
sy = sx;
targetH = (int)(sy * source.getHeight());
}
if (type == BufferedImage.TYPE_CUSTOM) { //handmade
ColorModel cm = source.getColorModel();
WritableRaster raster = cm.(targetW, targetH);
boolean alphaPremultiplied = cm.isAlphaPremultiplied();
target = new BufferedImage(cm, raster, alphaPremultiplied, null);
} else
target = new BufferedImage(targetW, targetH, type);
Graphics2D g = target.createGraphics();
//smoother than exlax:
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY );
g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
g.dispose();
return target;
}
public static void saveImageAsJpg (String fromFileStr,String saveToFileStr,int width,int hight)
throws Exception {
BufferedImage srcImage;
// String ex = fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
String imgType = "JPEG";
if (fromFileStr.toLowerCase().endsWith(".png")) {
imgType = "PNG";
}
// System.out.println(ex);
File saveFile=new File(saveToFileStr);
File fromFile=new File(fromFileStr);
srcImage = ImageIO.read(fromFile);
if(width > 0 || hight > 0)
{
srcImage = resize(srcImage, width, hight);
}
ImageIO.write(srcImage, imgType, saveFile);
}
public static void main (String argv[]) {
try{
//參數1(from),參數2(to),參數3(寬),參數4(高)
saveImageAsJpg("C:\\Documents and Settings\\xugang\\桌面\\tmr-06.jpg",
"C:\\Documents and Settings\\xugang\\桌面\\2.jpg",
120,120);
} catch(Exception e){
e.printStackTrace();
}
}
Ⅲ 如何消亡java的bufferedimage對象
java 中對象的回收不像C++要手動回收。系統會根據當前內存的消耗情況自動調用,垃圾回器回收。具體回收哪些,不受程序控制。不過一般會回收一些沒有引用指向的內存。就是那這個對象的引用值為null。前提和這個對象一樣引用同一塊內存的引用都值為null.系統發現這塊內存地址沒用了,就會回收。你可以手動調用gc回收,但是不能控制回收哪些。你這個對象用完後值為null就行。
Ⅳ java 中關於BufferedImage的使用
gr.drawImage(bufferedImage,j*30,i*30,30,30,Color.WHITE,null);
null這個參數不對吧,好象是當前窗口的對象.
Ⅳ 我用BufferedImage方法讀入了一張圖片,現在我想將這張圖片改變成640*380的大小再使用,該怎麼辦
可以用 java.awt.geom.AffineTransform , 具體方法如下.
(width是新的長度,height是新的高度,image是改變大小之後的圖片,source是原本從文件中讀入的圖片)
int width = 640;
int height = 380;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
AffineTransform at = AffineTransform.getScaleInstance(
(double) width / source.getWidth(),
(double) height / source.getHeight());
g.drawRenderedImage(source, at);
Ⅵ java BufferedImage 內存無法回收是怎麼回事
因為你是在同一個方法中 sleep ,如果程序中有使用內存大的語句,在使用完成後,需要手工將內存釋放,
BufferedImage b1 = new ....
使用完後:
b1 = null
這樣,JVM 就會知道 b1 的內存可以回收了。
Ⅶ java直接壓縮bufferedimage黑色像素斑點問題。求大神解決。
壓縮太厲害了吧,75試試
Ⅷ JAVA與圖像壓縮
此篇轉載。
----------------------------------------------------------------------
下面是一段給圖片加上網站logo的代碼,注意第12,13,14行設置了圖片的壓縮比。本例為不壓縮原圖片。
java 代碼
BufferedImage image = ImageIO.read(new FileInputStream("c:\\base.jpg"));
//讀取圖標
BufferedImage image_biao = ImageIO.read(new FileInputStream(
"c:\\logo.gif"));
Graphics2D g = image.createGraphics();
g.drawImage(image_biao, 10, 10, image_biao.getWidth(null),
image_biao.getHeight(null), null);
g.dispose();
FileOutputStream out = new FileOutputStream("c:\\out.jpg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(image);
out.close();
setQuality
public void setQuality(float quality, boolean forceBaseline)
quality取值在 1.0 到 0.0 之間
Some guidelines: 0.75 high quality 0.5 medium quality 0.25 low quality
另外要得到一張指定高度和寬度的圖片的話可以用以下代碼:(接上面代碼)
java 代碼
BufferedImage tag = new BufferedImage(500, 300,image.getType());
tag.getGraphics().drawImage(image, 0, 0, 500, 300, null); //繪制縮小後的圖
FileOutputStream out2 = new FileOutputStream("c:\\out2.jpg");
JPEGImageEncoder encoder2 = JPEGCodec.createJPEGEncoder(out2);
JPEGEncodeParam param2 = encoder.getDefaultJPEGEncodeParam(tag);
param2.setQuality(1f, false);
encoder2.setJPEGEncodeParam(param2);
encoder2.encode(tag);
out2.close();
注意第一行新建 BufferedImage 的時候要使用原圖片的type,這樣可以保證輸出與原圖片相同質量的圖片。
Ⅸ java BufferedImage 如何使圖像更小
貌似處理2D圖形縮放用的是AffineTransform,在JDK文檔(我看的中文的哈)里有詳細的參數解釋,只要學過數組相乘就行了。
此矩陣將源坐標 (x,y) 變換為目標坐標 (x',y'),這一過程將坐標視為列向量,並用矩陣乘以坐標向量,步驟如下:
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ]
[ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
方法TYPE_MASK_SCALE可以進行縮放操作,主要是要會算哈,不會就去學線性代數,很簡單的
Ⅹ java 圖片的壓縮
前面是轉成JPG再轉出
後面是直接輸出