public static boolean resize(String fromPath, int w, int h) {
log.debug("开始压缩图片"+fromPath);
try {
FileInputStream f = new FileInputStream (fromPath) ;
//数组的大小和文件的大小一致
byte[] b = new byte[f.available()];
f.read(b);
f.close() ;
ImageInfo info = new ImageInfo() ;
MagickImage image = new MagickImage(info,b);
MagickImage scaled = image.scaleImage(w ,h);
scaled.setFileName(fromPath);
scaled.writeImage(info);
scaled.destroyImages() ;
log.debug("图片压缩成功!");
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (MagickException e) {
e.printStackTrace();
return false;
}
} 图片缩放,裁减等操作时,图片的像素唱过6000x9000或者上万的时候处理速度就极慢,而且造成死机、当机、其他程序不能运行,不能做任何操作等;有没有大牛帮忙出出主意,用什么方式能够提高图片处理速度,降低cpu和内存的占用率,并且不降低图片处理的效果的!在线等!
log.debug("开始压缩图片"+fromPath);
try {
FileInputStream f = new FileInputStream (fromPath) ;
//数组的大小和文件的大小一致
byte[] b = new byte[f.available()];
f.read(b);
f.close() ;
ImageInfo info = new ImageInfo() ;
MagickImage image = new MagickImage(info,b);
MagickImage scaled = image.scaleImage(w ,h);
scaled.setFileName(fromPath);
scaled.writeImage(info);
scaled.destroyImages() ;
log.debug("图片压缩成功!");
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (MagickException e) {
e.printStackTrace();
return false;
}
} 图片缩放,裁减等操作时,图片的像素唱过6000x9000或者上万的时候处理速度就极慢,而且造成死机、当机、其他程序不能运行,不能做任何操作等;有没有大牛帮忙出出主意,用什么方式能够提高图片处理速度,降低cpu和内存的占用率,并且不降低图片处理的效果的!在线等!
java -Xms1024m -Xmx2048m Text
原则上32位JDK最大内存不超过4G,64位JDK不超过128G,应该不会出错了JAVA不像C++可以操作指针,文件都是一次性加载,你要保证启动时的初始化最大内存够用,否则就会报内存溢出。
f.read(b);
f.close() ;图片如果比较大,你这样创建数组,每次都分配这么大的空间,而且你后面还要处理图片转换,虽然是用jni方式调用的,但是imagemagick本身效率就不高,肯定要等待,内存又不能立即释放,线程一多,肯定容易挂了。。建议: 把图片转换功能抠出来,异步处理。弄几个线程跑,线程放池里,每次并发10个左右的线程,把你要转换的参数放队列中,这样内存占用率不会高的,既提高效率又能重复利用
非要在java里处理吗?用其它做图软件不可以吗?
谢谢你的回帖,创建数组这步我已经删掉了,添加了
if(magickmage!=null){
magickmage.destroyImages();
}
if(image != null){
image.destroyImages();
}
保证内存及时回收,效率提高了点,但离要求还有点差距;
你说的异步处理,我们这里不太适用,图片处理包含很多步骤,需要的时间比较长,异步的话会造成大量的来不处理的图片的堆积,同样后继工作也无法展开;