3

我有一个 CMYK 模式的位图,在 Android 上显示不正确,有时根本不显示。谷歌搜索并没有返回很多答案,所以我不得不在这里问我如何处理 CMYK 模式图像?

谢谢

更新

好的,根据要求提供更多信息。我有一个在资产中的图像,我用它构造了一个位图。然后,当我构建位图时,我会这样做:

Bitmap bm = Bitmap.createBitmap(width, height, Config.ARGB_8888);

图像处于 CMYK 模式。当我把它放在 ImageView 上时 - 它显示为白框。未显示。

希望这可以帮助。

4

4 回答 4

0

CMYK 是一种打印格式。所有“标准”结构,例如 jpeg、位图等,都用于 SCREEN,并像 RGB 一样读取您的结构。将结果放在 PDF 或其他 postscript 中,您会看到它。

于 2011-11-18T21:30:01.483 回答
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:31:21.983 回答
0

下面是一个示例代码,使用android-lib-magick来显示具有 CMYK 色彩的图像(Android 不支持),它是从 URL 获取的。

https://github.com/Mariovc/GetCMYKImage

有两种方法称为“getCMYKImageFromPath”和“getCMYKImageFromURL”。

于 2013-12-11T11:22:43.173 回答
0

我还使用了来自https://github.com/puelocesar/android-lib-magick的库 下面是我的代码,您不需要在存储上创建新文件:

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

        if(image.getColorspace() == ColorspaceType.CMYKColorspace) {
            Log.e("ImageMagick", "ColorSpace BEFORE => " + image.getColorspace());
            boolean status = image.transformRgbImage(ColorspaceType.CMYKColorspace);
            Log.e("ImageMagick", "ColorSpace AFTER => " + image.getColorspace() + ", success = " + status);
        }

        Bitmap bitmap = MagickBitmap.ToBitmap(image);
        Log.e("ImageMagick", "bitmap is " + bitmap);
        ivCMYK.setImageBitmap(bitmap);
    } catch (MagickException e) {
        Log.e("MagickException", e.getMessage());
    }
于 2013-07-26T04:11:50.180 回答