java cmyk转rgb_图片 CMYK转RGB 代码

news/2024/10/23 9:31:24/

//大部分情况都转换没问题,有极个别的转换不成功。现在想,是不是调用convert.exe 更方便 呵呵

private static boolean isCMYK(String filename) {

boolean result = false;

BufferedImage img = null;

try {

img = ImageIO.read(new File(filename));

} catch (IOException e) {

System.out.println(e.getMessage() + ": " + filename);

try {

//把这个文件拷贝出来

FileUtils.copyFile(new File(filename), new File("/var/ftp/" + FilenameUtils.getName(filename)));

} catch (IOException ex) {

java.util.logging.Logger.getLogger(CMYK2RGB.class.getName()).log(Level.SEVERE, null, ex);

}

}

if (img != null) {

int colorSpaceType = img.getColorModel().getColorSpace().getType();

result = colorSpaceType == ColorSpace.TYPE_CMYK;

}

return result;

}

// extract metadata

public static BufferedImage readImage(File file) throws IOException {

// Get an ImageReader.

try {

ImageInputStream input = ImageIO.createImageInputStream(file);

Iterator readers = ImageIO.getImageReaders(input);

if (readers == null || !readers.hasNext()) {

return null;

}

ImageReader reader = (ImageReader) readers.next();

reader.setInput(input);

String format = reader.getFormatName();

if ("JPEG".equalsIgnoreCase(format) || "JPG".equalsIgnoreCase(format)) {

try {

IIOMetadata metadata = reader.getImageMetadata(0);

String metadataFormat = metadata.getNativeMetadataFormatName();

IIOMetadataNode iioNode = (IIOMetadataNode) metadata.getAsTree(metadataFormat);

NodeList children = iioNode.getElementsByTagName("app14Adobe");

if (children.getLength() > 0) {

try {

iioNode = (IIOMetadataNode) children.item(0);

int transform = Integer.parseInt(iioNode.getAttribute("transform"));

Raster raster = reader.readRaster(0, reader.getDefaultReadParam());

if (input != null) {

input.close();

}

reader.dispose();

return createJPEG4(raster, transform);

} catch (Exception e) {

// TODO Auto-generated catch block

log.error(e);

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

log.error(e);

// LogWriter.log(file.getPath());

}

}

} catch (NumberFormatException e) {

// TODO Auto-generated catch block

return null;

}

return null;

}

/**

*

* Java's ImageIO can't process 4-component images

*

* and Java2D can't apply AffineTransformOp either,

*

* so convert raster data to RGB.

*

* Technique due to MArk Stephens.

*

* Free for any use.

*

*/

private static BufferedImage createJPEG4(Raster raster, int xform) {

try {

int w = raster.getWidth();

int h = raster.getHeight();

byte[] rgb = new byte[w * h * 3];

// if (Adobe_APP14 and transform==2) then YCCK else

// CMYK

if (xform == 2) { // YCCK --

// Adobe

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);

}

} else {

// assert xform==0: xform;

// CMYK

int[] C = raster.getSamples(0, 0, w, h, 0, (int[]) null);

int[] M = raster.getSamples(0, 0, w, h, 1, (int[]) null);

int[] Y = raster.getSamples(0, 0, w, h, 2, (int[]) null);

int[] K = raster.getSamples(0, 0, w, h, 3, (int[]) null);

for (int i = 0, imax = C.length, base = 0; i < imax; i++, base += 3) {

int c = 255 - C[i];

int m = 255 - M[i];

int y = 255 - Y[i];

int k = 255 - K[i];

float kk = k / 255f;

rgb[base] = (byte) (255 - Math.min(255f, c * kk + k));

rgb[base + 1] = (byte) (255 - Math.min(255f, m * kk + k));

rgb[base + 2] = (byte) (255 - Math.min(255f, y * kk + k));

}

}

// from other image types we know InterleavedRaster's can be

// manipulated by AffineTransformOp, so create one of those.

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);

} catch (Exception e) {

// TODO Auto-generated catch block

log.error(e);

return null;

}

}


http://www.ppmy.cn/news/826667.html

相关文章

CMYK convert RGB

libjpeg 处理CMYK 格式数据以及iCC配置文件 ICC文件&#xff0c;又叫ICC Color Profile&#xff0c;是指设备管理色彩特性的文件&#xff0c;各种具有色彩管理功能的软件&#xff08;如photoshop&#xff09;可以依据ICC文件的配置对不同设备的颜色特点进行准确地显示&#xf…

java cmyk和rgb的转换_CMYK与RGB相互转换(java)

package util; import java.awt.*; import javax.swing.*; import java.awt.color.*; public class ColorTranslate { ICC_Profile ICC_pf; ICC_ColorSpace ICC_ClSpace; //以下变量存储CMYK颜色值&#xff0c;取值为0到100 int C 9; int M 9; int Y 9; int K 9; //初始化I…

java cmyk和rgb的转换_如何在ColdFusion(Java)中在CMYK和RGB之间转换图像?

小编典典 我使用Java ImageIO库(https://jai-imageio.dev.java.net)。它们不是完美的&#xff0c;但可以很简单&#xff0c;就可以完成工作。至于从CMYK转换为RGB&#xff0c;这是我能想到的最好的方法。 下载并安装适用于您平台的ImageIO JAR和本机库。本地库是必不可少的。没…

CMYK 和 RGB 着色

CMYK 和 RGB 着色 The CMYK color model (process color, four color) is a subtractive color model, used in color printing, and is also used to describe the printing process itself. CMYK refers to the four inks used in some color printing: cyan, magenta, yello…

java cmyk和rgb的转换_CMYK和RGB怎么转换

作为设计师新手&#xff0c;常常会遇到电脑里的图和实际打印出来的图颜色对不上的问题&#xff0c;只能不断调整再打印&#xff0c;费钱又费时。其实这都是因为颜色模式不同的原因&#xff0c;我们可以通过CorelDRAW 2019(Win版)调整&#xff0c;减少损失。 RGB(如图一)是通过对…

CMYK与RGB参数转换公式及转换方法

1. RGB色彩模式 自然界中绝大部分的可见光谱可以用红、绿和蓝三色光按不同比例和强度的混合来表示。RGB分别代表着3种颜色&#xff1a;R代表红色&#xff0c;G代表绿色、B代表蓝色。RGB模型也称为加色模型&#xff0c;如图5所示。RGB模型通常用于光照、视频和屏幕图像编辑。 …

最常用的计算机色彩表示方法——RGB模式与CMYK模式

现实绘画中需要的各种颜色&#xff0c;是通过红、黄、蓝三种原色进行调配得到的。而计算机里的颜色表示也是通过类似的“调配”的方法来完成。 其中最常见的两种表示方法即为RGB模式与CMYK模式。 一. RGB模式 RGB色彩就是常说的三原色&#xff0c;R代表Red&#xff08;红色&a…

治理Crash的相关开源框架介绍

治理Crash的相关开源框架介绍 4.1、xCrash&#xff08;应用崩溃捕获工具&#xff09; 4.2、KOOM&#xff08;快手自研OOM解决方案&#xff09; 4.3、Matrix&#xff08;腾讯APM框架Matrix&#xff09; 4.4、Cockroach 4.5、Recovery&#xff08;奔溃恢复框架&#xff09; …