我需要用色彩空间CMYK旋转我的TIFF图像.标准的Java ImageIO不支持CMYK TIFF图像,所以我使用了TWelveMonkey插件.但这并没有起到作用.当我试图旋转我的图像时,我遇到了一个例外.

我做以下事情:

try (InputStream is = new ByteArrayInputStream(bytes);
        ImageInputStream iis = ImageIO.createImageInputStream(is)) {
      Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);

      if (!iter.hasNext()) {
        throw new RuntimeException("Image type is not supported");
      }

      ImageReader reader = iter.next();
      BufferedImage bi;
      try {
        reader.setInput(iis);
        bi = reader.read(0);
      } finally {
        reader.dispose();
      }
      int type = bi.getType();
      BufferedImage newBi;
      if (angle == 90 || angle == 270) {
        newBi= new BufferedImage(height, width, type);
      } else {
        newBi= new BufferedImage(width, height, type);
      }
      //writing the image content to new buffered image
}

但它投出了java.lang.IllegalArgumentException: Unknown image type 0英镑.如何为TIFF CMYK映像创建BufferedImage?或者至少我可以如何旋转TIFF CMYK图像?

推荐答案

在Java中,要旋转BufferedImage,通常的方法是使用AffineTransformOp.这将允许您旋转任何图像,而不必预先创建相同类型的新图像.

有关示例,请参阅十二只猴子"Conrib"模块中的TIFFUtilities.applyOrientation方法.如果您愿意,也可以直接使用此方法.请注意,输入的是TIFF方向标记常量值之一,而不是Angular :

即.要旋转90度(假定静态导入是为了提高可读性):

BufferedImage original;

BufferedImage rotated = applyOrientation(original, ORIENTATION_RIGHTTOP); // 6

对于更一般的主题"How can I create a BufferedImage for a TIFF CMYK image",快速答案是像这样使用the constructor that takes a WritableRaster and a ColorModel as argument:

BufferedImage original;

ColorModel cm = original.getColorModel();
WritableRaster raster = cm.createCompatibleWritableRaster(newWidth, newHeight);
BufferedImage image = new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null);

您必须使用此构造函数,因为任何CMYK BufferedImage都必须是TYPE_CUSTOM(常量值0).接受类型参数的BufferedImage构造函数不允许TYPE_CUSTOM(毕竟,在无数可能的定制类型中,那会是哪种类型呢?)

Java相关问答推荐

Java字符串常数池困惑

同时运行JUnit测试和Selenium/Cucumber测试时出现问题

为什么Java的代码工作(if condition内部的实例)

为什么我们不能实现两个接口,其中一个接口有相同的签名,其中一个接口有默认的实现在java?'

蒙蒂霍尔比赛结果不正确

在Spring Boot中使用哪个Java类来存储创建时间戳?

将响应转换为带值的键

自定义批注的外推属性值

如何从Keyloak映射Hibernate实体中的用户

使用多个RemoteDatabase对象的一个线程

%This内置函数示例

使用While循环打印素数,无法正常工作

如何在ApacheHttpClient 5中为单个请求设置代理?

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

保持标题窗格的箭头可见,即使设置为不可折叠

Android上的SQLite:Android.database.SQLite.SQLiteReadOnlyDatabaseException:try 写入只读数据库(代码1032 SQLite_readonly_DBMOVED)

ControlsFX RangeSlider在方向垂直时滞后

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为

OpenAPI Maven插件生成错误的Java接口名称

Spring Integration SFTP 连接失败 - 无法协商 kex 算法的密钥交换