Ⅰ 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再转出
后面是直接输出