I am using a image processing library in java to manipulate images.The first step I do is I read an image and create a java.awt.Image.BufferedImage
object. I do it in this way,
BufferedImage sourceImage = ImageIO.read( new File( filePath ) );
The above code creates a BufferedImage
object with a DirectColorModel
:
rmask=ff0000
gmask=ff00
bmask=ff
amask=0.
This is what happens when I run the above code on my macbook.
But when I run this same code on a linux machine (hosted server), this creates a BufferedImage
object with ColorModel
:
pixelBits = 24
numComponents = 3
color space = java.awt.color.ICC_ColorSpace@c39a20
transparency = 1 has alpha = false
isAlphaPre = false.
I used the same jpg image in both the cases. I don't know why the ColorModel
of the same image is different when run on mac and linux. The ColorModel
for mac has 4 components and the colormodel for linux has 3 components.
There is a problem arising because of this, the image processing library that I use always assumes that there are always 4 components in the ColorModel of the image passed, and it throws an array out of bounds exception when run on the linux box. But on macbook, it runs fine.
Adding a little more info, Once the image is read, I printed out image.getType()
TYPE_INT_RGB
(a value of 1
) TYPE_3BYTE_BGR
(a value of 5
) I am not sure if I am doing something wrong or there is a problem with the library. Please let me know your thoughts. Also ask me any questions if I am not making sense!
I don't know exactly why you're getting two different color models although I believe they're quite the same. The DirectColorModel has 4 components but the alpha mask is 0, so in fact it only has 3 components just like the other one.
I suggest to write a simple helper function which makes sure the image has the right color model before you pass it to this image library. The helper function could make use of http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/ColorConvertOp.html or use something like the following code (untested):
private static BufferedImage makeCompatible(BufferedImage image) { int w = image.getWidth(); int h = image.getHeight(); BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g = result.createGraphics(); g.drawRenderedImage(image, new AffineTransform()); //or some other drawImage function g.dispose(); return result; }
Assuming that the library is able to handle BufferedImage.TYPE_4BYTE_ABGR. Otherwise you will have to put something else here. And of course, you could check if the original image already has the right format before converting it.
Adding a little more info, Once the image is read, I printed out image.getType()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.