/**
 *
 */
/**
 * @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;
    }
}

創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()