/**
* 图片合成视频
* @param mp4SavePath 视频保存路径
* @param imageDir 图片地址
* @param rate 这个可以理解成视频每秒播放图片的数量
*/
public static boolean jpgToMp4(String mp4SavePath, String imageDir, double rate) {
FFmpegFrameRecorder recorder = null
boolean flag = true
try {
File[] files = FileUtils.fileSort(imageDir)
int [] widthArray = new int[files.length]
int [] heightArray = new int[files.length]
/**
* 获取合成视频图片的最大宽高,避免图片比例不一致最终合成效果差
*/
for (int i = 0i <files.lengthi++) {
BufferedImage bufferedImage = ImageIO.read(files[i])
widthArray[i] = bufferedImage.getWidth()
heightArray[i] = bufferedImage.getHeight()
}
/**
* 这个方法主要是防止图片比例达不到视频合成比例的要求,如果达不到下面条件视频则会无法播放
* 图片宽:必须要被32整除
* 图片高:必须要被2整除
*/
int [] maxWH = getImgMaxWH(widthArray,heightArray)
recorder = new FFmpegFrameRecorder(mp4SavePath,maxWH[0],maxWH[1])
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264)
/**
* 视频质量:目前测试出来的是25-30最清晰,视频质量范围好像是0-40,具体可以自己慢慢测
*/
recorder.setVideoQuality(25)
recorder.setFormat("mp4")
recorder.setFrameRate(rate >0 ? rate : 1)
recorder.setPixelFormat(0)
recorder.start()
OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage()
/**
* 合成视频
*/
for(int i = 0i <files.lengthi++ ){
opencv_core.IplImage image = cvLoadImage(files[i].getPath())
recorder.record(conveter.convert(image))
opencv_core.cvReleaseImage(image)
}
logger.info("合成成功")
} catch(Exception e) {
e.printStackTrace()
flag = false
logger.error("合成失败")
} finally {
try {
if (recorder != null){
recorder.stop()
recorder.release()
}
} catch (FrameRecorder.Exception e) {
e.printStackTrace()
}
}
return flag
}
Image image1 = ImageIO.read(new File(fileurl1))Image image2 = ImageIO.read(new File(fileurl2))
int width = image.getWidth(5000)// 得到图片的长,宽
int height = image.getHeight(5000)
BufferedImage bufferedimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB)// 构造一个内存图片
bufferedimage.getGraphics().drawImage(image1, 0, 0, width, height, null)// 将本地图片画入到内存图片
bufferedimage.getGraphics().drawImage(image2, 0, 0, image1.getWidth, image1.getHeight, null)
response.setContentType("image/jpeg")// 设置返回头部
response.setHeader("Pragma", "No-cache")
response.setHeader("Cache-Control", "no-cache")
response.setDateHeader("Expires", 0)
ImageIO.write(bufferedimage, "JPEG", response.getOutputStream()) //写到浏览器
大概方向就是这样,把图片放到内存中,然后绘制内存图片,把他们包含进去,然后把内存图片返回。
我乱改的,不能跑的。前不久刚做过
你可以试试
==========================================
几张图放一起没试过,你可以试试在绘了一张后,接着会第2张,他们的开始地点相同,看会不会被覆盖
public static void many2one(List<String>bookFilePaths, String toPath,String distFileName) {if (bookFilePaths != null &&bookFilePaths.size() >0) {
File[] files = new File[bookFilePaths.size()]
for(int i = 0i <bookFilePaths.size()i++){
files[i] = new File(bookFilePaths.get(i))
}
if (files != null &&files.length >0) {
try {
ArrayList pages = new ArrayList(files.length - 1)
FileSeekableStream[] stream = new FileSeekableStream[files.length]
for (int i = 0i <files.lengthi++) {
stream[i] = new FileSeekableStream(
files[i].getCanonicalPath())
}
ParameterBlock pb = (new ParameterBlock())
PlanarImage firstPage = JAI.create("stream", stream[0])
for (int i = 1i <files.lengthi++) {
PlanarImage page = JAI.create("stream", stream[i])
pages.add(page)
}
TIFFEncodeParam param = new TIFFEncodeParam()
boolean f = makeDirs(toPath)
System.out.println(f)
OutputStream os = new FileOutputStream(toPath + File.separator+ distFileName)
ImageEncoder enc = ImageCodec.createImageEncoder("tiff",
os, param)
param.setExtraImages(pages.iterator())
enc.encode(firstPage)
for (int i = 0i <files.lengthi++) {
stream[i].close()
}
os.close()
} catch (IOException e) {
e.printStackTrace()
}
}
}
}