- 浏览: 114727 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zxjlwt:
学习了!http://surenpi.com
Eclipse开发之进度条 -
coolboyysy:
解决的办法是:导入相关包即可解决。包名如下:jruby-con ...
请教Tomcat启动,Spring调用时的java.lang.ClassNotFoundException: groov -
sitoto:
给个对应的确build.xml 的例子啊,,
使用Ant 构建Eclipse RCP Product -
masuweng:
今天培训恰好讲到这些内容了
单例模式在多线程下的使用 -
zhaofangtao:
hi
你这个示例是在 3.2还是3.4的??
我的3.4里 ...
记录swt对话框上次打开的地址
/**
*
*/
/**
* @author
*
*/
package com.qunar.wireless.ugc.caravan.business.las.record;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.Calendar;
import java.util.List;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.qunar.wireless.ugc.caravan.jsonbean.las.response.record.inner.BaseRecordInfo;
import com.qunar.wireless.ugc.caravan.jsonbean.las.response.record.inner.CityInfo;
import com.qunar.wireless.ugc.caravan.jsonbean.las.response.record.inner.FeelingInfo;
import com.qunar.wireless.ugc.exception.DaoException;
import com.qunar.wireless.ugc.exception.ServiceException;
import com.qunar.wireless.ugc.jsonbean.request.upload.UploadedPic;
import com.qunar.wireless.ugc.jsonbean.response.pic.inner.AlbumInfo;
import com.qunar.wireless.ugc.jsonbean.response.pic.inner.PicInfo;
import com.qunar.wireless.ugc.module.comon.Suite;
import com.qunar.wireless.ugc.module.pic.Album;
import com.qunar.wireless.ugc.util.AlbumUtils;
import com.qunar.wireless.ugc.util.PicUploadUtil;
import com.qunar.wireless.ugc.util.PicUtil;
import com.qunar.wireless.ugc.util.StringUtils;
import com.qunar.wireless.ugc.util.WebConstants;
@Component(value="mergePic")
public class MergePic{
@Resource
private AlbumUtils albumUtils;
private int headHeight =0;//头像高度
private int headWidth = 0;//头像宽度
private int innerMargin = 7;//头像内部边距
private int leftMargin = 18;//图片距离左边画布距离
private int margin = 30;//图片之间间隔
private int titleHeight = 150;//标题高度
private int lineHeight = 14;//行高
private int mainCanvasHeight =0;//图片和描述的总高度
private int mainCanvasWidth = 450;//主画布宽度
private static final String backgroundUrlString = "http://img1.qunarzz.com/wugc/p170/201209/03/1531e6d21fa15a6a93835fbb.png";//背景图片
private static final String anchorIconString = "http://img1.qunarzz.com/wugc/p245/201209/03/0a22fedb3d530d1393835fbb.png";
private static final String timeIconString = "http://img1.qunarzz.com/wugc/p182/201209/03/24536348de2d6c1a93835fbb.png";//日期图片
private static final String userHeadUrl = "http://source.qunar.com/site/images/wap/lvtu/lvtu_userhead.gif";
private static final Logger log = Logger.getLogger(MergePic.class);
/**
* @param album
* @param visitUserId
* @param injectAllRecordList 是否注入游记中所有记录列表(会过滤删除和黄反状态)
* @param pureText 照片描述/心情描述是否转换为纯文本,true表示@标签转换为@XXX(被@的用户昵称),</br> 客户端仅显示不可点击;false表示在@标签内加入昵称,仍然是标签的形式,客户端可以点击
* @return
* @throws DaoException
* @throws ServiceException
* @return 图片服务器返回的url
*/
public String createMergedPic(Album album, Long userId, boolean injectAllRecordList,boolean pureText) throws DaoException,
ServiceException {
String result = "";
try {
AlbumInfo albumInfo = albumUtils.getAlbumDetail(album, userId, injectAllRecordList,pureText);
//开始分析头像
String headUrl=albumInfo.getUserInfo().getHeadUrl();
if(headUrl==null){
headUrl = userHeadUrl;
}
URL url = new URL(headUrl);
BufferedImage headBufferedImage = ImageIO.read(url);
headHeight = headBufferedImage.getHeight();//得到头像高度
headWidth = headBufferedImage.getWidth();//得到头像宽度
//start------开始读取游记题目-------------------------------------------------------------------------------------
OutputStream outputStream = getTitle(albumInfo);
ByteArrayInputStream byteArrayInputStream = null;
if(outputStream instanceof ByteArrayOutputStream){
byteArrayInputStream = new ByteArrayInputStream( ((ByteArrayOutputStream) outputStream).toByteArray());
}
BufferedImage titleImage = ImageIO.read(byteArrayInputStream);
//开始分析游记
List<BaseRecordInfo> recordInfoList = albumInfo.getRecordList();
log.info("共生成了"+albumInfo.getRecordTotal()+"个图片或文字!");
for(BaseRecordInfo baseRecordInfo:recordInfoList){
if(baseRecordInfo.getType() == Suite.RecordType.PIC.getValue()){//如果是图片
PicInfo pic = (PicInfo)baseRecordInfo;
String picUrl = PicUtil.getMiniUrl(pic.getUrl(), WebConstants.PIC_SIZE_450_5000);
System.out.println(picUrl);
URL pUrl = new URL(picUrl);
BufferedImage bufferedImage = ImageIO.read(pUrl);
int height= bufferedImage.getHeight();//得到图片高度
mainCanvasHeight +=height;
int textheight = StringUtils.getStringLineNum(pic.getDesc(),48);//假设每行最多显示48个字节
mainCanvasHeight +=textheight;//加上图片描述的高度
mainCanvasHeight += lineHeight;//加上最下面表示时间的一行高度
}else if(baseRecordInfo.getType() == Suite.RecordType.FEELING.getValue()){//如果是心情
FeelingInfo feelingInfo = (FeelingInfo)baseRecordInfo;
String desc = feelingInfo.getDesc();
int textheight = StringUtils.getStringLineNum(desc,48);//假设每行最多显示48个字节
mainCanvasHeight +=textheight;//加上图片描述的高度
mainCanvasHeight += lineHeight;//加上最下面表示时间的一行高度
}
}
//开始生成主画布,在上面生成拼图
BufferedImage mainBufferedImage = new BufferedImage(mainCanvasWidth, mainCanvasHeight, BufferedImage.TYPE_INT_RGB);//创建一个画布
Graphics2D graphics2d = (Graphics2D)mainBufferedImage.getGraphics(); //获取画布的画笔
//生成头像栏
graphics2d.setBackground(new Color(236,230,211));//创建背景色
graphics2d.clearRect(0, 0, mainCanvasWidth, mainCanvasHeight);
graphics2d.setPaint(new Color(129,183,83));
graphics2d.fillRect(0, 0, mainCanvasWidth, headHeight+innerMargin*2);
graphics2d.drawImage(headBufferedImage, leftMargin, innerMargin, null);
graphics2d.setPaint(new Color(246,250,242));
graphics2d.setFont(new Font("宋体",Font.BOLD,20));
graphics2d.drawString("", headWidth+innerMargin*2, headHeight/2+innerMargin);//头像右边的字
//生成标题图片
graphics2d.drawImage(titleImage, leftMargin, headHeight+innerMargin*2+margin, null);
int baseHight = headHeight+innerMargin*2+margin+titleImage.getHeight();//标题图片的高度
//开始生成游记的每个图片和心情图片
for(BaseRecordInfo baseRecordInfo:recordInfoList){
OutputStream oStream = getPicText(baseRecordInfo);
if(oStream instanceof ByteArrayOutputStream){
byteArrayInputStream = new ByteArrayInputStream( ((ByteArrayOutputStream) oStream).toByteArray());
}
BufferedImage picTextmage = ImageIO.read(byteArrayInputStream);
baseHight +=margin;
graphics2d.drawImage(picTextmage, leftMargin, baseHight, null);
baseHight +=picTextmage.getHeight();
}
//将生成后的拼图写到服务器share目录下
String random = RandomStringUtils.random(5, true, true);
String fileName = Calendar.getInstance().getTimeInMillis() + random + ".jpg";
String filePath = PicUtil.getShareFileUploadDir() + File.separator + fileName;
File file = new File(filePath);
boolean f = ImageIO.write(mainBufferedImage, "jpg", file);
if(f){
log.info("生成拼图成功!");
}else{
log.info("生成拼图出错!");
}
//将生成的拼图上传到图片服务器中,并返回图片的CDN地址
List<UploadedPic> uploadedPicList = PicUploadUtil.uploadImg(file);
if (uploadedPicList != null && uploadedPicList.size() > 0) {
UploadedPic uploadedPic = uploadedPicList.get(0);
result = uploadedPic != null && org.apache.commons.lang.StringUtils.isNotBlank(uploadedPic.getImg()) ? PicUtil
.getPicCDNUrl(uploadedPic.getImg()) : result;
}
} catch (DaoException e) {
e.printStackTrace();
throw new DaoException();
} catch (ServiceException e) {
e.printStackTrace();
throw new ServiceException();
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
private OutputStream getPicText(BaseRecordInfo baseRecordInfo) {
OutputStream outputStream = new ByteArrayOutputStream();
try {
int canvasHeight =0;//主画布高度
int height = 0;
int textheight =0;//描述或心情的高度
BufferedImage bufferedImage = null;
String desc ="";
if(baseRecordInfo.getType() == Suite.RecordType.PIC.getValue()){//如果是图片
PicInfo pic = (PicInfo)baseRecordInfo;
desc = pic.getDesc();
String picUrl = PicUtil.getMiniUrl(pic.getUrl(), WebConstants.PIC_SIZE_450_5000);
URL pUrl = new URL(picUrl);
bufferedImage = ImageIO.read(pUrl);
height= bufferedImage.getHeight();//得到图片高度
canvasHeight +=height;
textheight = StringUtils.getStringLineNum(desc,48);//假设每行最多显示48个字节
canvasHeight +=textheight;//加上图片描述的高度
canvasHeight += lineHeight;//加上最下面表示时间的一行高度
}else if(baseRecordInfo.getType() == Suite.RecordType.FEELING.getValue()){//如果是心情
FeelingInfo feelingInfo = (FeelingInfo)baseRecordInfo;
desc = feelingInfo.getDesc();
textheight = StringUtils.getStringLineNum(desc,48);//假设每行最多显示48个字节
canvasHeight +=textheight;//加上图片描述的高度
canvasHeight += lineHeight;//加上最下面表示时间的一行高度
}
BufferedImage mianBufferedImage = new BufferedImage(mainCanvasWidth, canvasHeight, BufferedImage.TYPE_INT_RGB);//创建一个画布
Graphics2D graphics2d = (Graphics2D)mianBufferedImage.getGraphics(); //获取画布的画笔
graphics2d.setBackground(new Color(255,255,255));//创建背景色
graphics2d.clearRect(0, 0, mainCanvasWidth, canvasHeight);
if(baseRecordInfo.getType() == Suite.RecordType.PIC.getValue()){//如果是图片
PicInfo pic = (PicInfo)baseRecordInfo;
String time = pic.getCreateTime();
graphics2d.drawImage(bufferedImage, 0, 0, null);//图片
if(desc != null && !desc.equals("")){//描述
graphics2d.setPaint(new Color(60,60,60));
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(desc, leftMargin+4, height);
}
if(pic.getAddressOpenType() ==Suite.WhetherType.YES.getValue()){//POI
URL anchorUrl = new URL(anchorIconString);
BufferedImage anchorBufferedImage = ImageIO.read(anchorUrl);
String addressNameString = pic.getAddressName() +" " +pic.getParentAddressName();
graphics2d.drawImage(anchorBufferedImage, leftMargin, canvasHeight-lineHeight, null);
graphics2d.setPaint(new Color(65,152,167));//地址颜色,TODO
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(addressNameString, leftMargin+4, canvasHeight-lineHeight);
}
if(time != null && !time.equals("")){//时间
URL timerUrl = new URL(timeIconString);
BufferedImage timeBufferedImage = ImageIO.read(timerUrl);
graphics2d.drawImage(timeBufferedImage, 250, canvasHeight-lineHeight, null);//时间位置相对固定的
graphics2d.setPaint(new Color(65,152,167));
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(time, 270, canvasHeight-lineHeight);
}
}else if(baseRecordInfo.getType() == Suite.RecordType.FEELING.getValue()){//如果是心情
FeelingInfo feelingInfo = (FeelingInfo)baseRecordInfo;
String time = feelingInfo.getCreateTime();
graphics2d.setPaint(new Color(60,60,60));
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(desc, 0, 0); //画描述
if(feelingInfo.getAddressOpenType() ==Suite.WhetherType.YES.getValue()){//POI
URL anchorUrl = new URL(anchorIconString);
BufferedImage anchorBufferedImage = ImageIO.read(anchorUrl);
String addressNameString = feelingInfo.getAddressName() +" " +feelingInfo.getParentAddressName();
graphics2d.drawImage(anchorBufferedImage, leftMargin, canvasHeight-lineHeight, null);
graphics2d.setPaint(new Color(65,152,167));//地址颜色,TODO
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(addressNameString, leftMargin+4, canvasHeight-lineHeight);
}
if(time != null && !time.equals("")){//时间
URL timerUrl = new URL(timeIconString);
BufferedImage timeBufferedImage = ImageIO.read(timerUrl);
graphics2d.drawImage(timeBufferedImage, 250, canvasHeight-lineHeight, null);//时间位置相对固定的
graphics2d.setPaint(new Color(65,152,167));
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(time, 270, canvasHeight-lineHeight);
}
}
boolean f = ImageIO.write(mianBufferedImage, "jpg", outputStream);
if(f){
log.info("生成图片成功!");
}else{
log.info("生成图片出错!");
}
} catch (IOException e) {
log.info("生成图片出错!");
e.printStackTrace();
}
return outputStream;
}
public OutputStream getTitle(AlbumInfo albumInfo){
OutputStream outputStream = new ByteArrayOutputStream();
try {
int width = 430;//标题图片的宽度
int height = 150;//标题图片的高度
String title = albumInfo.getName();
title = StringUtils.truncateStr(title,20);
String dateString = albumInfo.getStartDate();
String tripString = ""+albumInfo.getTravelDayNum()+"天旅程";
String cityString = "";
List<CityInfo> cList = albumInfo.getCityList();
for(CityInfo cityInfo:cList){
cityString +=cityInfo.getName()+" ";
}
URL url = new URL(backgroundUrlString);
BufferedImage headBufferedImage = ImageIO.read(url);
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//创建一个画布
Graphics2D graphics2d = (Graphics2D)bufferedImage.getGraphics(); //获取画布的画笔
graphics2d.setBackground(new Color(236,230,211));//创建背景色
graphics2d.clearRect(0, 0, width, height);
graphics2d.drawImage(headBufferedImage, 0, 0, null);
graphics2d.setPaint(new Color(60,60,60));
graphics2d.setFont(new Font("宋体",Font.BOLD,20));
graphics2d.drawString(title, 20, 30);
graphics2d.setFont(new Font("宋体",Font.PLAIN,14));
graphics2d.drawString(dateString, 45, 70);
graphics2d.drawString(tripString, 200, 70);
graphics2d.drawString(cityString, 30, 100);
boolean f = ImageIO.write(bufferedImage, "jpg", outputStream);
if(f){
log.info("生成图片成功!");
}else{
log.info("生成图片出错!");
}
} catch (IOException e) {
log.info("生成图片出错!");
e.printStackTrace();
}
return outputStream;
}
}
发表评论
-
拼图测试类
2012-09-04 16:40 1207/** * */ /** * @author ... -
有用的SQL
2010-10-14 18:37 11241.db2 删除重复的记录:delete from (sele ... -
工作中遇到的问题总结---不断更新
2010-10-14 18:35 148261. 启动tomcat报找不到com.ibm.db2.jcc. ... -
Javascript在页面加载时的执行顺序
2010-09-08 09:37 1483Javascript在页面加载时的执行顺序 收藏 一、在H ... -
XML to XML 转换的类
2009-11-27 15:02 1041/** * <p> * Title: Parser ... -
我自己写的XML to XML 转换的工具
2009-11-27 14:58 1191一、xml to xml 转换原理 在ESB中,很多时候需要 ... -
今天写的拷贝某个目录下所有符合要求的文件名到某个指定文件名的工具类
2009-02-12 14:57 1141今天因为想把eclipse语言 ... -
Java传值还是传引用终极解释,还是看老外解释的清楚啊。
2008-06-12 15:39 6618by http://www.javaworld.com/jav ... -
使用JXL读Excel文件
2007-09-15 15:52 3869使用JXL读Excel文件 以前用过POI解析Excel,但是 ...
相关推荐
【JAVA拼图游戏设计报告】 本报告详细阐述了一个基于Java技术开发的拼图游戏的设计与实现。游戏的主要特点是自动化处理图片切割与加载过程,避免用户手动操作,且能根据图片大小自适应调整窗口尺寸,防止拼图错误和...
Java拼图游戏是一款基于Java Swing库开发的桌面应用程序,展示了丰富的编程技术和概念。在这个游戏中,开发者运用了Swing来构建用户界面,同时结合了多线程技术以实现平滑的游戏动画,增强了玩家的体验。 首先,...
Java拼图游戏是一种基于编程语言Java开发的娱乐性应用程序,主要目标是提供一个拼图解决的互动平台。这种游戏通常包含图像分割成多个部分,玩家需要通过移动这些部分来恢复原始图像。在这个Java实现的版本中,我们...
【标题】:“java拼图游戏 拼图” 在编程领域,拼图游戏是一个常见的练习项目,用于学习和掌握各种编程技术。这个“java拼图游戏”是一个利用Java语言实现的简单应用程序,它旨在帮助初学者熟悉Java的基础知识,如...
【Java拼图游戏程序】是一种基于Java编程语言开发的互动娱乐软件,主要目的是提供一个智力挑战,让玩家通过移动和旋转各个小块来重组一幅完整的图像。这种游戏通常以图像碎片的形式呈现,玩家需要利用逻辑思维和空间...
【Java拼图小游戏】是一款基于Java编程语言开发的娱乐项目,旨在帮助初学者通过实践学习和理解Java的基础应用。这个游戏的实现涉及了多个Java编程的关键知识点,包括面向对象设计、图形用户界面(GUI)开发、事件...
Java 拼图小游戏源代码分析 Java 拼图小游戏是一个使用 Java 语言编写的拼图游戏,游戏界面包括一个 4x4 的游戏面板、一个预览面板和三个按钮:开始、预览和设置。游戏使用 Java 的 AWT 库来实现图形用户界面。 ...
Java拼图游戏源代码是一种基于Java编程语言实现的益智类游戏,通常称为“拼图”或“拼图谜题”。这种游戏的核心是将一幅完整的图像分割成多个小块,玩家需要通过移动这些小块来恢复原图。下面将详细探讨Java拼图游戏...
在本项目中,我们关注的是一个名为"完整的java拼图程序"的软件开发实例,它是一个用Java编程语言实现的简单而实用的拼图游戏。Java作为一种广泛使用的面向对象的编程语言,以其跨平台的特性,强大的类库支持以及丰富...
【标题】:“java拼图游戏代码”所涉及的知识点主要集中在使用Java编程语言开发一个计时拼图游戏,这是一种基于Applet小程序的应用。Applet是Java早期用于在Web浏览器中运行的小型应用程序,它能够增强网页的交互性...
以下我们将详细介绍Java拼图游戏的设计思路、核心概念和技术点。 1. **基本概念** - **Java游戏开发**:Java以其跨平台的特性,使得开发的游戏可以在多种操作系统上运行。它支持2D和3D图形,以及音频处理,为游戏...
【Java拼图小游戏课设】是一个典型的编程课程设计项目,主要使用Java语言来实现一个趣味性的拼图游戏。在这个项目中,学生将学习并实践Java编程基础,包括面向对象编程、图形用户界面(GUI)设计以及事件处理等关键...
【Java拼图小游戏】是一个基于Java编程语言开发的娱乐项目,它允许用户在电子设备上体验拼图游戏的乐趣。这个游戏的源代码是开放的,用户可以根据自己的需求进行修改,特别是图片路径的部分,以便使用自己喜欢的图片...
在本项目"Java拼图游戏课程设计"中,开发者运用了Java编程语言,结合丰富的功能,为用户提供了有趣且互动性强的小游戏体验。这个小游戏包含了背景音乐、计时功能以及不同等级的选择,使得游戏不仅具备娱乐性,还具有...
【JAVA拼图游戏源码.zip】是一个包含Java编程语言实现的拼图游戏的源代码包。这个游戏可能是一个经典的拼图游戏,玩家需要将打乱的图片重新排列成完整的图像。以下是对这个源码包的详细解析: 一、源码结构与技术栈...
【Java拼图游戏开发详解】 Java拼图游戏是一款基于编程语言Java实现的益智类游戏,它通常包含图像处理、算法设计以及用户交互等多个技术环节。在这个游戏中,玩家需要通过移动图片的不同部分来恢复原始图像,挑战...
### Java拼图小游戏项目开发详解 #### 一、项目规划和设计 1. **确定游戏目标**: - 游戏的主要目标是让玩家通过移动拼图块来完成一幅图片的拼图。为了增加趣味性,可以设定不同的关卡,每个关卡有不同的难度和...