java下cmyk图片读取和转换rgb,以及图片压缩

news/2024/10/23 7:20:35/

首先感谢

https://www.cnblogs.com/interdrp/p/7076202.html

https://blog.csdn.net/ybn187/article/details/52185269

https://blog.csdn.net/keketrtr/article/details/88129641。

 

package test;import com.joyhua.utils.CMYKUtil;
import com.joyhua.utils.CMYKUtil1;
import net.coobird.thumbnailator.Thumbnails;import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;public class test4 {public static void main(String[] args) {String sourceString = "E:\\test\\p1.jpg";File source = new File(sourceString);String toString = "E:\\test\\p1_rgb.jpg";File to = new File(toString);String toString1 = "E:\\test\\p1_s.jpg";File to1 = new File(toString);try {Thumbnails.of(CMYKUtil.readImage(source)).width(500).height(704).outputFormat("jpg").toFile(to1);//图片是cmyk,需要转换为rgb// Thumbnails.of(source).width(500).height(704).outputFormat("jpg").toFile(to);} catch (IOException e) {e.printStackTrace();}}
}
package com.joyhua.utils;import org.apache.log4j.Logger;import javax.imageio.IIOException;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;/*** CREATE BY zz ON 2019-03-26**/
public class CMYKUtil {static Logger log = Logger.getLogger(CMYKUtil.class);/*** @description: CMYK格式图片转RGB格式图片的处理,因为Thumbnails无法处理CMYK格式图片*/public static BufferedImage readImage(File file) throws IOException {return readImage(ImageIO.createImageInputStream(file));}public static BufferedImage readImage(InputStream stream) throws IOException {return readImage(ImageIO.createImageInputStream(stream));}public static BufferedImage readImage(ImageInputStream input) throws IOException {Iterator<?> readers = ImageIO.getImageReaders(input);if (readers == null || !readers.hasNext()) {return null;}ImageReader reader = (ImageReader) readers.next();reader.setInput(input);BufferedImage image;try {// 尝试读取图片 (包括颜色的转换).image = reader.read(0); //RGB} catch (IIOException e) {// 读取Raster (没有颜色的转换).Raster raster = reader.readRaster(0, null);//CMYKimage = 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);}
}

 

转换完后会发现图片颜色不对了,需要引入一下三个maven

<dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-jpeg</artifactId><version>3.5</version></dependency><dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-tiff</artifactId><version>3.5</version></dependency><dependency><groupId>com.twelvemonkeys.servlet</groupId><artifactId>servlet</artifactId><version>3.5</version></dependency>

jdk的ImageIO有自动发现功能,会自动查找相关的编解码类并使用,而不使用jdk默认的编解码类,所以使用这个库是完全无入侵的。


 


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

相关文章

php rgb转cmyk,php – 使用Imagick将图像从RGB转换为CMYK

我正在尝试将RGB图像转换为CMYK,因为它们需要打印. 我正在使用此代码&#xff1a; $filePath rgb.jpg; // First save image as png $image new Imagick($filePath); $image->setImageCompression(Imagick::COMPRESSION_UNDEFINED); $image->setImageCompressionQualit…

RGB 和 CMYK 相互转换原理

作者&#xff1a;quester  来自&#xff1a;蓝色理想 Adobe 色彩系统 RGB 和 CMYK 相互转换原理 为了说明 adobe 的 RGB 转换 CMYK 的过程&#xff0c;不得不先涉及到一些色彩转换程序方面的东西。 CMYK_ADOBE_COLORSPACE: r (k*c)/maxval; g (k*m)/maxval; b (k*y)…

mupdf中CMYK与RGB的转换算法

之前碰到过RGB与CMYK之间转换的问题,网上也没有比较官方的转换公式,不同的软件可能会采用不同的算法,现在mupdf,正好也看到了这样的算法,还是有一定参考价值的,具体算法如下: #define MIN(a,b) ( (a) < (b) ? (a) : (b) ) #define MAX(a,b) ( (a) > (b) ? (a) …

php 将rgb转cmyk,将CMYK颜色值和RGB颜色相互转换的PHP代码

function hex2rgb($hex) { $color str_replace(‘#‘,‘‘,$hex); $rgb array(‘r‘ > hexdec(substr($color,0,2)), ‘g‘ > hexdec(substr($color,2,2)), ‘b‘ > hexdec(substr($color,4,2))); return $rgb; } // www.jb51.net function rgb2cmyk($var1,$g0,$b0)…

Java读取图片 cmyk转rgb

背景 使用java处理图片的时候&#xff0c;比如用ImageIo.read&#xff08;图片&#xff09;时&#xff0c;是不能处理CMYK的图片的&#xff0c;会报错&#xff0c;因此&#xff0c;我们需要将CMYK转化为RGB模式&#xff0c;并且排除转换时的色差问题。 代码 package com.e36…

php cmyk转rgb,用PHP将CMYK格式的JPG文件转为RGB格式 | 学步园

上次说到&#xff0c;CMYK格式的JPG用IE6浏览时无法显示&#xff0c;解决方法是用PS之类的软件转成RGB。但对于网站来说&#xff0c;用户并不知道这么解决&#xff0c;所以还是要程序想办法解决了。解决方法是用imagick或者imagemagick来处理图片&#xff0c;imagick代码如下&a…

ps出现两种颜色模式CMYK/RGB模式

如上图ps窗口出现两种颜色模式&#xff0c;会导致所在页面颜色变暗 解决方案 在视图窗口取消校样颜色就可以了

java cmyk转rgb_Java实现把cmyk格式图片转换为RGB格式图片

这个代码是我在网上找的&#xff0c;可以运行。 package com.pb.util; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.image.BufferedIma…