PDCIEBasedColorSpace.java
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pdfbox.pdmodel.graphics.color;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.IOException;
/**
* CIE-based colour spaces specify colours in a way that is independent of the characteristics
* of any particular output device. They are based on an international standard for colour
* specification created by the Commission Internationale de l'Éclairage (CIE).
*
* @author John Hewson
*/
public abstract class PDCIEBasedColorSpace extends PDColorSpace
{
//
// WARNING: this method is performance sensitive, modify with care!
//
@Override
public BufferedImage toRGBImage(WritableRaster raster) throws IOException
{
// This method calls toRGB to convert images one pixel at a time. For matrix-based
// CIE color spaces this is fast enough. However, it should not be used with any
// color space which uses an ICC Profile as it will be far too slow.
int width = raster.getWidth();
int height = raster.getHeight();
BufferedImage rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
WritableRaster rgbRaster = rgbImage.getRaster();
// always three components: ABC
float[] abc = new float[3];
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
raster.getPixel(x, y, abc);
// 0..255 -> 0..1
abc[0] /= 255;
abc[1] /= 255;
abc[2] /= 255;
float[] rgb = toRGB(abc);
// 0..1 -> 0..255
rgb[0] *= 255;
rgb[1] *= 255;
rgb[2] *= 255;
rgbRaster.setPixel(x, y, rgb);
}
}
return rgbImage;
}
@Override
public BufferedImage toRawImage(WritableRaster raster) throws IOException
{
// There is no direct equivalent of a CIE colorspace in Java. So we can
// not do anything here.
return null;
}
@Override
public String toString()
{
return getName(); // TODO return more info
}
}