How to create unique images with Image.getInstance()?

I need to use the GetInstance() variant that accepts raw bitmap data: Image.getInstance(int width, int height, int components, int bpc, byte[] data); But if I call it repeatedly, even if the bitma

I need to use the GetInstance() variant that accepts raw bitmap data:

Image.getInstance(int width, int height, int components, int bpc, byte[] data);
But if I call it repeatedly, even if the bitmap data is actually different, I get the first instance back instead of a new one. This is a very good feature with, for instance, path-based fixed images but not that good for on-the-fly image generation. How can I guarantee a new bitmap every time?

Posted on StackOverflow on Nov 21, 2014 by Gábor

Please take a look at the RawImages example. In this example, I create 8 images using the method you mention, one in color space gray, three in color space RGB, four in color space CMYK:

Image gray = new Image(ImageDataFactory.create(1, 1, 1, 8, new byte[]{(byte) 0x80}, null));
gray.scaleToFit(30, 30);
Image red = new Image(ImageDataFactory.create(1, 1, 3, 8, new byte[]{(byte) 255, (byte) 0, (byte) 0}, null));
red.scaleToFit(30, 30);
Image green = new Image(ImageDataFactory.create(1, 1, 3, 8, new byte[]{(byte) 0, (byte) 255, (byte) 0}, null));
green.scaleToFit(30, 30);
Image blue = new Image(ImageDataFactory.create(1, 1, 3, 8, new byte[]{(byte) 0, (byte) 0, (byte) 255}, null));
blue.scaleToFit(30, 30);
Image cyan = new Image(ImageDataFactory.create(1, 1, 4, 8, new byte[]{(byte) 255, (byte) 0, (byte) 0, (byte) 0}, null));
cyan.scaleToFit(30, 30);
Image magenta = new Image(ImageDataFactory.create(1, 1, 4, 8, new byte[]{(byte) 0, (byte) 255, (byte) 0, (byte) 0}, null));
magenta.scaleToFit(30, 30);
Image yellow = new Image(ImageDataFactory.create(1, 1, 4, 8, new byte[]{(byte) 0, (byte) 0, (byte) 255, (byte) 0}, null));
yellow.scaleToFit(30, 30);
Image black = new Image(ImageDataFactory.create(1, 1, 4, 8, new byte[]{(byte) 0, (byte) 0, (byte) 0, (byte) 255}, null));
black.scaleToFit(30, 30);

As you can see, each image is exactly one pixel in size, and I chose different byte[] values so that I get pixels in gray, red, green, blue, cyan, magenta, yellow and black. I also scale these image to a bigger size (otherwise it would be difficult to see them).

Now I add the images like this:

doc.add(gray);
doc.add(red);
doc.add(green);
doc.add(blue);
doc.add(cyan);
doc.add(magenta);
doc.add(yellow);
doc.add(black);
doc.close();

The result does not correspond with what you claim in your question: raw_images.pdf

Raw images
Raw images

There must be another error in your code, but since you don't share any code, nobody can answer your question.

Yes, I stand corrected. I used these images as soft masks and it turned out after much searching that the original images were replicated and forcing the same masks everywhere, not the on-the-fly generated masks themselves. Mea culpa and thanks.

Click this link if you want to see how to answer this question in iText 5.



Ready to use iText?

Try our iText 7 Library and add-ons FREE for 30 days. Test your proof of concept, and see if our solution is right for you.

Get my FREE trial
Contact

Still have questions? 

We're happy to answer your questions. Reach out to us and we'll get back to you shortly.

Contact us
Stay updated

Join 11,000+ subscribers and become an iText PDF expert by staying up to date with our new products, updates, tips, technical solutions and happenings.

Subscribe Now