2

我需要将 CYMK 图像的字节转换为 RGB 图像的字节。
我认为可以跳过标头的字节并将其他字节转换为 RGB,然后更改标头字节的RGB格式。
哪些是要更改的标头字节RGB
没有ICC配置文件的位颜色转换公式是什么?

有人可以帮我完成这段代码吗?

//Decode with inSampleSize
Bitmap Resultbitmap;
string path = "imageFileCmyk.jpg";
int scale=4;
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inPurgeable = true;
o2.inSampleSize=scale;
o2.inDither = false;                                                        
Resultbitmap = BitmapFactory.decodeStream(new FileInputStream(path), null, o2);
if (Resultbitmap==null) // Warning!! unsupported color conversion request
{
    File tmpfile = new File(path);
    FileInputStream is = new FileInputStream(tmpfile.getPath());
    byte[] cmykBytes= new byte[(int)tmpfile.length()];
    byte[] rgbBytes= new byte[(int)tmpfile.length()];
    is.read(cmykBytes);
    for (int i = 0; cmykBytes.length>i; ++i)
    {
       if (i>11)  // skip header's bytes, is it correct ??
       {
          rgbBytes[i] = cmykBytes[i]?? // How ??
       }
    }
    // new header bytes for RGB format
    rgbBytes[??]= ?? // How ??
    Resultbitmap = BitmapFactory.decodeByteArray(rgbBytes, 0, rgbBytes.length, o2);
}
return Resultbitmap;

谢谢,
阿尔贝托

4

2 回答 2

0

我做到了!我找到了一个很好的工具,可以在 Android 平台上使用 CMYK、YCCK 等不常见的色彩空间正确处理 *.jpg 文件。使用https://github.com/puelocesar/android-lib-magick,它是免费且易于配置的 android 库。这是将 CMYK 图像转换为 RGB 颜色空间的片段:

ImageInfo info = new ImageInfo(Environment.getExternalStorageDirectory().getAbsolutePath() + "/cmyk.jpg");
MagickImage imageCMYK = new MagickImage(info);

Log.d(TAG, "ColorSpace BEFORE => " + imageCMYK.getColorspace());
boolean status = imageCMYK.transformRgbImage(ColorspaceType.CMYKColorspace);
Log.d(TAG, "ColorSpace AFTER => " + imageCMYK.getColorspace() + ", success = " + status);

imageCMYK.setFileName(Environment.getExternalStorageDirectory().getAbsolutePath() + "/cmyk_new.jpg");
imageCMYK.writeImage(info);
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()
            + "/Docs/cmyk_new.jpg");
if (bitmap == null) {
    //if decoding fails, create empty image 
    bitmap = Bitmap.createBitmap(imageCMYK.getWidth(), imageCMYK.getHeight(), Config.ARGB_8888);
}    
ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
imageView1.setImageBitmap(bitmap);
于 2013-04-09T08:39:26.440 回答
0

只需导入android-lib-magick代码来转换其色彩空间就非常简单:

ImageInfo info = new ImageInfo(path); // path where the CMYK image is your device
MagickImage imageCMYK = new MagickImage(info);
imageCMYK.transformRgbImage(ColorspaceType.CMYKColorspace);
Bitmap bitmap = MagickBitmap.ToBitmap(imageCMYK);

Kord,即使不需要再次保存转换后的图像,您也可以使用它创建一个位图。如果图像不在您的设备或 SD 卡中,您需要先下载它。

我已经使用android-lib-magick实现了两个简单的方法,称为“getCMYKImageFromPath”和“getCMYKImageFromURL”。你可以在这里看到代码:

https://github.com/Mariovc/GetCMYKImage

于 2013-12-11T11:35:59.577 回答