Java CMYK转RGB源码网上很多,但是RGB转CMYK源码网上很少,那么多是只提供公式,要么提供依赖文件不全。这两天搜索很好久,终于找到一个可行方法。

项目使用maven搭建,依赖的工具包如下。在pom.xm文件添加该包依赖

      <dependency><groupId>javax.media.jai</groupId><artifactId>com.springsource.javax.media.jai.codec</artifactId><version>1.1.3</version></dependency>
package cn.soqi.mp.qihome.controller;import cn.soqi.mp.api.qihome.AjaxResult;
import cn.soqi.mp.app.listener.AppContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.awt.color.ColorSpace;
import java.awt.color.ICC_ColorSpace;
import java.awt.color.ICC_Profile;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.*;@Controller
@RequestMapping("/mg/image")
public class TestImageBinary {static BASE64Encoder encoder = new sun.misc.BASE64Encoder();static BASE64Decoder decoder = new sun.misc.BASE64Decoder();@RequestMapping("/page.html")public String intoUploadPage(){return "/mg/management/rgb2cmyk";}@RequestMapping("/upload.do")@ResponseBodypublic AjaxResult uploadOneImage(HttpServletRequest request,@RequestParam(required = false) String targetName,@RequestParam("pic") MultipartFile file) throws IOException{AjaxResult result = new AjaxResult();InputStream input = null ;OutputStream output = null ;if(file.isEmpty()==false){input=file.getInputStream();}//1 先将用户上传的文件保存到本地String temFileName=mkFile(file.getOriginalFilename(),"original");File saveFile = new File(temFileName);output = new FileOutputStream(saveFile) ;int temp = 0 ;byte data[] = new byte[512] ;while((temp=input.read(data,0,512))!=-1){output.write(data) ;    // 分块保存}input.close() ;output.close() ;//endString targetFileName=null;if(targetName!=null&&!targetName.equals("")) {targetFileName = mkFile(targetName, "after_transfer");}InputStream inputStream = new FileInputStream(saveFile);rgbToCmyk(inputStream, saveFile.getAbsolutePath(), targetFileName);result.setSuccess(true);result.setContent("上传成功并转码");return result;}static String getImageBinary(String fileName){File f = new File(fileName);BufferedImage bi;try {bi = ImageIO.read(f);String fileType=getFileType(fileName);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(bi, fileType, outputStream);byte[] bytes = outputStream.toByteArray();return encoder.encodeBuffer(bytes).trim();} catch (IOException e) {e.printStackTrace();}return null;}/*** 获取文件类型* @param fileName 文件全名* @return*/static String getFileType(String fileName){return fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());}/*** 将其他格式的图片转换成CDR或其它文件格式* @param sourceFileName  上传文件名* @param newFileName  新文件名*/static void base64StringToImage(String sourceFileName,String newFileName){try {String base64String =getImageBinary(sourceFileName);byte[] bytes1 = decoder.decodeBuffer(base64String);ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes1);BufferedImage bi1 =ImageIO.read(inputStream);File w2 = new File(newFileName);//可以是jpg,png,gif格式ImageIO.write(bi1, getFileType(sourceFileName), w2);} catch (IOException e) {e.printStackTrace();}}/*** 创建文件名* @param fileName 文件名* @param parentDir 可变参数,文件目录(在当前路径下新建目录)* @return 返回文件绝对路径*/static String mkFile(String fileName,String...parentDir) throws IOException {StringBuffer absoluteFileName = getCurrentPath();if(parentDir.length>0){absoluteFileName.append(File.separator);absoluteFileName.append(parentDir[0]);File newDir=new File(absoluteFileName.toString());if(!newDir.exists()){newDir.mkdirs();}}absoluteFileName.append(File.separator);absoluteFileName.append(fileName);String templateName=absoluteFileName.toString();File file=new File(templateName);if(!file.exists()){file.createNewFile();}return absoluteFileName.toString();}/*** 获取当前项目运行路径* @return*/public static StringBuffer getCurrentPath(){StringBuffer absoluteFileName = new StringBuffer();ServletContext scontext = AppContext.getInstance().getContext();absoluteFileName.append(scontext.getRealPath("/"));absoluteFileName.append("WEB-INF");return absoluteFileName;}/*** 将rgb图片转化为cmyk图片* @param fileName 文件名* @param format 转化之后的文件格式(默认tif格式)* @throws IOException*/public static void rgbToCmyk(String fileName,String...format) throws IOException{BufferedImage rgbImage = ImageIO.read(new File(fileName));BufferedImage cmykImage = null;ColorSpace cpace = new ICC_ColorSpace(ICC_Profile.getInstance(TestImageBinary.class.getClassLoader().getResourceAsStream("common/ISOcoated_v2_300_eci.icc")));ColorConvertOp op = new ColorConvertOp(rgbImage.getColorModel().getColorSpace(), cpace, null);cmykImage = op.filter(rgbImage, null);String newFileName=null;newFileName = fileName.substring(0, fileName.lastIndexOf("."));if(format.length>0) {JAI.create("filestore", cmykImage, newFileName + format[0], format[0]);}else {JAI.create("filestore", cmykImage, newFileName + "tif", "TIFF");}}/*** 将图片为rgb转化为cmyk* @param inputStream 图片输入流* @param fileName 图片名词(绝对路径)* @param newFileName 图片保存路径(绝对路径)(如果没有参数,则生成的图片在当前目录下,且格式为tif)* @throws IOException*/public static void rgbToCmyk(InputStream inputStream,String fileName,String...newFileName) throws IOException{BufferedImage rgbImage = ImageIO.read(inputStream);BufferedImage cmykImage = null;ColorSpace cpace = new ICC_ColorSpace(ICC_Profile.getInstance(TestImageBinary.class.getClassLoader().getResourceAsStream("ISOcoated_v2_300_eci.icc")));ColorConvertOp op = new ColorConvertOp(rgbImage.getColorModel().getColorSpace(), cpace, null);cmykImage = op.filter(rgbImage, null);if(newFileName.length>0&&newFileName[0]!=null) {String targetFileName=fileName.substring(0,fileName.lastIndexOf(".")+1)+"tif";JAI.create("filestore", cmykImage,targetFileName,"TIFF");cmykImage.flush();base64StringToImage(targetFileName,newFileName[0]);//转成对应格式File file=new File(fileName);if(file.exists())file.delete();}else {String targetFileName=fileName.substring(0,fileName.lastIndexOf(".")+1)+"tif";JAI.create("filestore", cmykImage, targetFileName, "TIFF");}}}

项目需要依赖ISOcoated_v2_300_eci.icc文件,ISOcoated_v2_300_eci.icc是一个工业的色彩标准文件。

JAVA RGB转CMYK 源码(支持格式转换)相关推荐

  1. swf转换成html源码,swf格式转换成html(Swf format conversion HTML).doc

    swf格式转换成html(Swf format conversion HTML) swf格式转换成html(Swf format conversion HTML) Now basically is t ...

  2. cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端

    cocos2dx+JAVA手游<全民挂机>全套源码支持安卓+IOS双端,客户端用cocos2dx 2.2.3实现,服务端用java,支持安卓+IOS双端,一款很不错的挂机游戏源码! 源码下 ...

  3. macOS 音频编辑剪切软件源码支持mp3等格式(教程含源码)

    实战需求 macOS 音频编辑剪切软件源码支持mp3等格式(教程含源码) 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 支持剪切音频 支持复制音频 支持删除音频 支持un ...

  4. ssh+mysql实现的Java web论坛系统源码

    今天给大家来演示一下一款有spring+struts2+hibernate+mysql实现的Java web论坛系统源码,本系统功能类似与csdn论坛,用户发帖时可以设置积分,当结帖时可以选择给评论的 ...

  5. axis2 webservice入门学识(JS,Java,PHP调用实例源码)

    来源:http://www.myexception.cn/web/952419.html axis2 webservice入门知识(JS,Java,PHP调用实例源码) 背景简介 最近接触到一个银行接 ...

  6. 【源码分享】java多用户B2B2C商城源码带WAP手机端源码

    分享一款非常不错的java多用户B2B2C商城源码,带WAP手机端源码,源码地址在文末. 需要源码学习,可私信我获取. 一.技术构架: 开发语言: Java1.7 数 据 库 : MySQL5.5 数 ...

  7. Java智慧校园系统源码,智慧学校源码 +小程序+电子班牌

    Java智慧校园系统源码 智慧学校源码 小程序+电子班牌 有演示,可正常上线运营+可授权 开发环境:Java+springboot+vue+element-ui+mysql 一款集智慧教学.智慧教务. ...

  8. Java精品项目系统源码第89期慢病报销管理信息系统

    Java精品项目系统源码第89期慢病报销管理信息系统 大家好,小辰今天给大家介绍一个基于Dao + Servlert + Jsp实现的慢病报销管理信息系统,演示视频文章末尾公众号对号查询观看即可 文章 ...

  9. PACS/RIS系统源码 支持专业三维影像后处理功能,支持海量数据存储、迁移管理

    PACS系统源码 支持专业三维影像后处理功能,系统有演示和自主知识产权. 私信了解更多内容! 系统主要功能: (一)影像处理 1.数据接收功能:接收.获取影像设备的DICOM3.0和非DICOM3.0 ...

最新文章

  1. R语言ggplot2可视化:在选定数据点周围添加三角形(Add Triangles Around Select Data Points)
  2. 酸了!会这个技能的 AI 工程师年薪至少35W起!
  3. 深度学习(DL)与卷积神经网络(CNN)学习随笔-05-基于Python的LeNet之CNN
  4. Confluence 6 升级完成后的检查
  5. TextDetection文本检测数据集汇总
  6. Linux输入子系统:输入设备编程指南 -- input-programming.txt
  7. jQuery 学习-样式篇(八):jQuery 设置元素的 CSS 样式
  8. 使用悲观锁还是乐观锁
  9. ibatis mybatis sql语句配置 符号不兼容 大于号 小于号
  10. LiveGBS/LiveNVR组合实现GB35114平台端和GB35114设备端的GB35114的交互流程
  11. 阿里巴巴达摩院发布2019十大科技趋势:数字身份将成为第二张身份证
  12. 在word文档中插入代码_如何在自动更新的Word文档中插入当前的月份和年份
  13. 表单格式化插件jquery.serializeJSON
  14. Eclipse - 取消英文拼写检查
  15. 网管实战(4):网关地址与子网掩码
  16. ALOS 12.5米DEM 数字高程模型数据免费下载介绍(20200617)
  17. 计算机组成原理相关话题,“计算机组成原理”教学改革研究
  18. 奥马电器赵国栋转让股份兜底钱包金融展期项目,奥马获国资输血
  19. 你真的了解getline()的返回值吗?—— basic_istream::getline() 与 string::getline
  20. 过程计算机系统 pcs,科学网-对PCS(等离子体控制系统)软件基本结构的理解-章勇的博文...

热门文章

  1. 学习数码管和键盘的笔记
  2. 公众号 自动生成海报 python_用python制作一个保存微信公众号里面可爱的小姐姐图的软件...
  3. 树莓派 2 和 3 上的 Swift 3.0
  4. Vue+element ui 表格中时间选择器范围控制(两种方式)
  5. 06.MTK关机充电动画显示
  6. 谷歌浏览器的字体问题
  7. Javascript之旅——第二站:对象和数组
  8. 计算机网络技术实验报告三,计算机网络第三次实验报告
  9. HTML学习笔记总结
  10. layui单元格换行