package com.makr.common.framework.common.util.img;
import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
*
* @ClassName: CmykToRgb
* @Description: cmyk模式图转换为RGB模式图
* @copyright
* @author 陈智航
* @date 2014年7月16日 上午10:51:22
*/
public class CmykToRgb {
public static Log logger = LogFactory.getLog(CmykToRgb.class);
public void readImage(String filename) throws IOException {
File file = new File(filename);
ImageInputStream input = ImageIO.createImageInputStream(file);
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (readers == null || !readers.hasNext()) {
throw new RuntimeException("1 No ImageReaders found");
}
ImageReader reader = (ImageReader) readers.next();
reader.setInput(input);
String format = reader.getFormatName();
BufferedImage image;
if ("JPEG".equalsIgnoreCase(format) || "JPG".equalsIgnoreCase(format)) {
try {
// 尝试读取图片 (包括颜色的转换).
image = reader.read(0); // RGB
} catch (IIOException e) {
// 读取Raster (没有颜色的转换).
Raster raster = reader.readRaster(0, null);// CMYK
image = createJPEG4(raster);
}
image.getGraphics().drawImage(image, 0, 0, null);
String newfilename = filename.substring(0,
filename.lastIndexOf("."))
+ "_rgb" + filename.substring(filename.lastIndexOf("."));
File newFile = new File(newfilename);
FileOutputStream out = new FileOutputStream(newFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.flush();
out.close();
}
}
public static BufferedImage cmyk2rgb(File file) throws IOException {
ImageInputStream input = ImageIO.createImageInputStream(file);
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (readers == null || !readers.hasNext()) {
throw new RuntimeException("1 No ImageReaders found");
}
ImageReader reader = (ImageReader) readers.next();
reader.setInput(input);
String format = reader.getFormatName();
BufferedImage image = null;
if ("JPEG".equalsIgnoreCase(format) || "JPG".equalsIgnoreCase(format)) {
try {
// 尝试读取图片 (包括颜色的转换).
image = reader.read(0); // RGB
} catch (IIOException e) {
// 读取Raster (没有颜色的转换).
Raster raster = reader.readRaster(0, null);// CMYK
image = createJPEG4(raster);
}
}
return image;
}
private static BufferedImage createJPEG4(Raster raster) {
int w = raster.getWidth();
int h = raster.getHeight();
byte[] rgb = new byte[w * h * 3];
// 彩色空间转换
float[] Y = raster.getSamples(0, 0, w, h, 0, (float[]) null);
float[] Cb = raster.getSamples(0, 0, w, h, 1, (float[]) null);
float[] Cr = raster.getSamples(0, 0, w, h, 2, (float[]) null);
float[] K = raster.getSamples(0, 0, w, h, 3, (float[]) null);
for (int i = 0, imax = Y.length, base = 0; i < imax; i++, base += 3) {
float k = 220 - K[i], y = 255 - Y[i], cb = 255 - Cb[i], cr = 255 - Cr[i];
double val = y + 1.402 * (cr - 128) - k;
val = (val - 128) * .65f + 128;
rgb[base] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
: (byte) (val + 0.5);
val = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128) - k;
val = (val - 128) * .65f + 128;
rgb[base + 1] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
: (byte) (val + 0.5);
val = y + 1.772 * (cb - 128) - k;
val = (val - 128) * .65f + 128;
rgb[base + 2] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff
: (byte) (val + 0.5);
}
raster = Raster.createInterleavedRaster(new DataBufferByte(rgb,
rgb.length), w, h, w * 3, 3, new int[] { 0, 1, 2 }, null);
ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel cm = new ComponentColorModel(cs, false, true,
Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
return new BufferedImage(cm, (WritableRaster) raster, true, null);
}
public static boolean isCmyk(File file) {
boolean result = false;
BufferedImage img = null;
try {
img = ImageIO.read(file);
} catch (IOException e) {
try {
JPEGImageDecoder decoder = JPEGCodec
.createJPEGDecoder(new FileInputStream(file));
img = decoder.decodeAsBufferedImage();
result = true;
} catch (ImageFormatException ef) {
logger.error("该图片不是JPG格式", ef);
} catch (IOException ex) {
logger.error("I0异常", ex);
}
}
return result;
}
public static void main(String[] args) throws IOException {
String filename = "E://0.jpg";
File file = new File(filename);
System.out.println(isCmyk(file));
}
}
分享到:
相关推荐
在Android平台上,大部分图像处理操作默认使用RGB模式,因此,将CMYK图片转换为RGB模式是必要的。 `android-lib-magick-master`是一个适用于Android的ImageMagick库的移植版本,ImageMagick是一个强大的跨平台...
### .NET 下的 RGB 图片转 CMYK 处理(C#) #### 知识点解析 在本文中,我们将深入探讨如何在.NET框架下使用C#编程语言实现从RGB色彩模式转换到CMYK色彩模式的过程。该转换通常用于准备图像以供打印,因为大多数...
总的来说,处理CMYK色彩模式的Tiff文件并转换为RGB模式是图像处理中的常见操作,特别是在需要在屏幕上显示或进行数字编辑时。了解这些基本概念和操作方法对于理解和处理这类图像至关重要。同时,理解色彩模式间的...
在RGB模式下,当三种颜色的光强度均为最大时,即红色、绿色和蓝色都亮到极致,会合成白色;而当三种颜色的光强度都为零时,即全部关闭,则呈现黑色。RGB颜色模式的取值范围通常为0(无该颜色光)到255(最大强度)。...
在标题提到的"CMYK图片转为RGB图片"中,我们涉及到了两种主要的颜色模型:CMYK和RGB。这两种颜色模型在不同的应用场景中有其特定的用途。 CMYK(青色、洋红、黄色、黑色)是一种减色模型,常用于印刷业。它基于油墨...
RGB模式中的每个颜色通道(R、G、B)的值范围通常在0到255之间,0代表无光,255代表最大亮度。这种模式用于创建和编辑网页图像、数字照片以及大部分计算机图形。 **CMYK色彩模式**: 与RGB相反,CMYK是一种减色模式...
java 实现cmyk转rgb,用ImageMagick转换需要额外安装软件,这个不需要安装额外软件
Adobe的RGB与CMYK色彩转换公式是为了在不同的色彩空间之间进行转换,尤其是在需要将图像转换为适合印刷的CMYK色彩模式时。色彩空间是用于描述颜色的一个数学模型,它们的转换通常很复杂,因为不同色彩空间的设计初衷...
在实际应用中,会根据CMYK的颜色值,通过一定的算法将其转换成对应的RGB值。这可能涉及到色彩管理配置文件(ICC profile),以确保在不同设备间颜色的一致性。 **源代码分析**: 压缩包中的文件名暗示了这个项目的...
这是因为网页和大多数数字设备使用RGB模式,而印刷品通常使用CMYK模式。本篇文章将详细讲解如何在Linux环境下批量将CMYK格式的图片转换为RGB格式。 首先,我们需要了解CMYK和RGB两种颜色模型的区别。CMYK是基于印刷...
### .NET 下的 RGB 图片转 CMYK 处理 在印刷行业中,通常需要将数字图像从 RGB 色彩空间转换为 CMYK 色彩空间,以确保打印出来的颜色与屏幕上的预览尽可能一致。本篇文章将详细介绍如何在 .NET 环境下实现这一转换...
在处理图像时,有时我们需要将RGB模式的图片转换为CMYK模式,因为大多数印刷设备使用CMYK颜色空间。这个过程涉及到色彩空间的转换,需要精确的算法和色彩配置文件,也就是ICC文件。ICC文件是一种标准,定义了特定...
在这个特定的场景中,我们关注的是如何使用ASPJPEG 2.0将CMYK色彩模式的JPEG图像转换为RGB色彩模式。 CMYK(青色、洋红、黄色、黑色)是印刷行业中广泛采用的颜色模型,因为它能够通过四种颜色油墨的组合来呈现丰富...
RGB到CMYK颜色空间转换在图像处理领域是一项常见的任务,尤其在印刷业中尤为重要,因为CMYK模式是用于彩色印刷的标准。RGB颜色模式基于红、绿、蓝三种原色,而CMYK则使用青、洋红、黄和黑四种颜色进行组合。这个名为...
这意味着,RGB模式可以在黑暗的房间内观看屏幕上的内容,而CMYK模式需要外界光源来阅读印刷的内容。 CMYK颜色对照表 ---------------- 下面是CMYK颜色对照表: | 颜色名称 | CMYK代码 | RGB代码 | HEX代码 | | --...
RGB模式主要用于电子显示设备,如电脑显示器,而CMYK模式则适用于印刷工艺。 RGB(红绿蓝)模式是基于光学原理的颜色模型,适用于发光设备。它的颜色由三种基本颜色——红色、绿色和蓝色的光混合而成,可以产生广泛...
同时,由于RGB模式的色彩空间大于CMYK,所以在编辑过程中能保留更多的细节和色彩层次。即使最后需要转换为CMYK模式,也应在RGB模式下完成大部分编辑工作,以最大限度地减少色彩损失。 在将RGB转换为CMYK时,分色...
在印刷行业中,尽管最终的印刷品必须基于CMYK模式,但使用Photoshop等软件进行图片处理时,通常推荐使用RGB模式,因为它提供了更宽的色彩空间和更多的编辑可能性。 对于从互联网下载或以RGB模式扫描的图片,应当在...
校色和修正过的RGB模式图片数据可以作为高质量的存档,便于未来需要时进行再处理或使用。总的来说,理解并熟练掌握RGB和CMYK模式的应用,是确保印刷图片处理质量和效果的关键。在实际操作中,根据图片来源和最终用途...
对于RGB模式的图片,如果原图就是该模式或者通过扫描仪以RGB模式扫描,那么直接使用此模式处理是理想的选择。尤其在处理互联网下载的图片时,确保使用RGB模式处理以保证印刷质量。在Photoshop中,可以开启CMYK预览...