最近给网站增加一个会员头像的功能,这就必然的会有用户上传图片然后压缩啊,剪裁啊 什么什么的。
做出来了,自己独自测试,通过了。然后交由老大验收,结果他在测试的时候,上传了一张比较大的jpg格式的图片,然后程序运行不通过了。我原本以为是图片太大导致,自己又重新测试,用了一张更大的图,通过了。这是为毛呢。然后看了看报错,Unsupport Image Type .度娘&谷哥后,原来是CMYK这么个东西,就是我自己测试的时候用的全是RGB的图片,老大测试的时候用的那张是CMYK的,然后就出现了这结果。 于是,继续度娘&谷哥,找到了一些将CMYK的图片转为RGB的源代码,COPY测试不通过。经过对几种方法的测试和"研究".ND 终于将这个问题搞定了。下面给出代码:
package com.test.common; 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.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.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; /** * * @author Dsmart */ public class CMYK { public void readImage(String filename) throws IOException { File file = new File(filename); ImageInputStream input = ImageIO.createImageInputStream(file); Iterator 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(); } } 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 void main(String[] args) throws IOException { String filename = "h:/img/test.jpg"; CMYK cm = new CMYK(); cm.readImage(filename); } }
由于CMYK和RGB的不同,所以在转换后会出现颜色变亮。
相关推荐
通过以上步骤,我们成功实现了在.NET环境下使用C#将RGB图像转换为CMYK图像的功能。这种方法适用于那些需要精确控制打印输出颜色的应用场景。值得注意的是,在实际项目开发中,还应该考虑到错误处理、资源管理等方面...
在IT领域,彩色图片转换软件是一种非常实用的工具,它主要功能是帮助用户将不同格式、色彩模式的图像文件进行转换,以满足特定的需求或适应不同的设备和平台。本篇文章将详细探讨彩色图片转换的相关知识点。 首先,...
RGB到CMYK颜色空间转换在图像处理领域是一项常见的任务,尤其在印刷业中尤为重要,因为CMYK模式是用于彩色印刷的标准。RGB颜色模式基于红、绿、蓝三种原色,而CMYK则使用青、洋红、黄和黑四种颜色进行组合。这个名为...
当我们谈论将彩色图像转化为三个RGB通道时,实际上是指将一个综合的彩色图像分解为三个独立的单色图像,每个图像对应于原图像的一个颜色通道:红色、绿色或蓝色。 RGB通道的概念源自彩色图像的像素表示。每个像素由...
而"lena_color.bmp"则是RGB彩色版本,它由红(Red)、绿(Green)、蓝(Blue)三个颜色通道组成,每个通道都有8位深度,总共24位色彩。这意味着每个像素由三个数值(R、G、B)表示,每个数值的范围也是0到255。通过...
标题中的“彩色图片转换成黑白图片(VB代码).rar”表明这是一个使用Visual Basic(VB)编程语言实现的项目,目标是将彩色图像转换为黑白图像。在计算机图形处理中,这种转换通常涉及到图像的灰度化过程。接下来,我们...
首先调用hex2rgb函数将十六进制颜色值(例如'#FF0000')转换为RGB数组,然后通过rgb2cmyk函数将得到的RGB数组转换为CMYK值。 为了理解以上过程,我们需要知道RGB和CMYK两种颜色模型的基本概念。RGB模型中,每个颜色...
处理彩色图片时,一般建议首先在RGB模式下进行编辑,因为它提供了更宽的色彩空间和更多的编辑可能性。一旦图像处理完成,再转换为CMYK模式以准备印刷。转换过程中,可以通过调整分色参数来优化色彩效果,减少色彩...
在报纸或杂志的排版过程中,彩色图片的处理是一个...只有在最终制版印刷前,才将图片转换为CMYK模式,同时通过优化分色参数来保证图片质量。这样不仅能够最大化保留图片的原始信息,还能确保印刷出来的效果接近预期。
下面是一个简单的C++代码示例,展示了如何使用OpenCV将图片转换为灰度图: ```cpp #include #include int main() { // 加载原始图像 cv::Mat srcImage = cv::imread("before/your_image.jpg"); // 检查是否...
例如,先将RGB图像转换为HSV,然后在HSV空间中反色,再转换回RGB,可能会得到更丰富的效果。 三、图形处理软件与编程库 实现图片反色处理,可以使用各种图形处理软件,如Adobe Photoshop、GIMP等,它们通常提供了...
此外,"Lenna.jpg"的色彩模式为彩色,这意味着它采用了某种颜色空间表示,如RGB(红绿蓝)或CMYK(青品黄黑)。在处理彩色图像时,需要考虑色彩空间转换、色彩校正等问题。比如,从RGB转换到CMYK,适用于印刷,反之...
7. 色彩空间转换:例如从RGB转换到灰度,或者从RGB到CMYK,适用于不同的打印和显示需求。 8. 图像编码与压缩:为了节省存储空间和传输时间,图像通常需要进行编码和压缩,如JPEG、PNG等压缩格式。 这个“标准图片...
在将RGB模式的图片转换为CMYK模式时,分色参数的设置至关重要。分色参数的微调可以优化转换过程,减少色彩损失。Photoshop提供对分色参数的控制,使得用户能够在转换过程中尽可能地保留原有的色彩信息。 对于需要...
处理完成后,再将RGB模式的图片转换为CMYK模式准备印刷,这样能尽量减少色彩信息的损失。 在Photoshop中,为了在编辑时预览印刷效果,可以开启RGB模式下的CMYK预览功能。这样,即使在RGB模式下工作,也能看到接近...
4. 色彩代码转换:除了RGB,还可能支持其他色彩模式,如CMYK、HSV、HEX等之间的转换,方便在不同应用场景下使用。 5. 屏幕拾色:提供一个取色工具,可以直接从屏幕上选取任何颜色的RGB值,这对于需要精确配色的工作...
对于防伪打印介质,水印图像的色彩空间将从RGB转换为CMYK,这将导致水印图像失真。 为此,提出了一种用于CMYK中打印图像的全息水印方案。 进行了打印扫描实验,以验证该方案由打印机代替打印机的可行性,并使用PSNR...
在探讨如何将一张bmp格式的彩色图片转换为黑白点阵图时,我们首先需要了解图像的基本构成。彩色图像通常基于RGB颜色模型,通过不同的红、绿、蓝(RGB)颜色强度的组合,来表达几乎所有颜色。而黑白图像则不同,它...
在处理完成后,再将图片转换为CMYK模式,以准备进行印刷。在转换过程中,可以通过调整分色参数来优化色彩效果,减少色彩损失。 对于从互联网下载的图片,通常都是RGB模式,为了保证印刷效果,需要在输出前将其转换...
总的来说,“秋天一键图片批量黑白V1.01”是一个实用的图像处理工具,借助Qt库的强大功能,提供了一键批量将彩色图片转换为黑白图片的服务,满足了用户在各种场景下的图片处理需求。通过简单操作,用户可以轻松实现...