How to convert inputstream of grayscale image to binary? - java

I am reading an grayscale tiff image into inputstream using
InputStream is=objCMBObject.getDataStream();
bytes = IOUtils.toByteArray(is);
response.setContentType(mimeType);
OutputStream os = response.getOutputStream();
and writing this stream into applet .but now I want to convert this grayscale image to binary image before writing to the applet. I don't want to save the image in file.
How to convert inputstream of grayscale to binary?
I can convert the image into binary if I have x,y coordinates but I don't know how to get it from inputstream.
Please guide.

When you want to manipulate an image, javax.imageio.ImageIO can be of great use. You can use that to load the image from the stream, apply some operation like a ColorConvertOp, and write the result back to a stream.
As ImageIO doesn't neccessarily support TIFF out of the box, you might have to use a suitable library to provide TIFF support. Answers to another question suggest using Java Advanced Imaging for this.

Related

Lossless image extraction from PDF

I'm using PDFBox to extract images out of a PDF file and feed it to another image processing library (that can handle different image formats). My current code is like this:
PDImageXObject pdImage;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage image = pdImage.getImage();
ImageIO.write(image, "png", baos);
byte[] imageBytes = baos.toByteArray();
This will take whatever is stored in the PDF file and use Java graphics to convert it to PNG. Is there a better way to avoid conversion and extract the image in whatever format it is embedded? I don't want to degrade image quality (I suppose mitigated by using a lossless format like PNG?) and incur conversion overhead.
The DEFLATE algorithm is used by the FlateDecode filter and by the PNG file format. However a stream of FlateDecode-compressed data isn't itself a PNG file.
Also, you need to consider the colorspace representation of the Image XObject (e.g. DeviceCMYK) versus what PNG actually supports.
By targeting lossless compression for your output image file you won't lose any information. (Be sure you actually need a lossless extracted image, often people assume lossy compression means their image will now have so many changes it's no longer recognizable. Though in many cases depending on the parameters the loss is hardly noticeable to the naked eye and you can substantially benefit from the size savings of Lossy compression.)
If performance is slow it could simply be the quality of your PDF software responsible for extracting the image and saving it.

Extract TIFF images from PDF without decoding

With the help of iText 5 I would like to extract all TIFF images from given PDF file and save them as TIFF files.
Examples and other posts (1, 2) use the following method:
Create PdfImageObject from PDF stream which in line 189 decodes the image stream (if corresponding filter implementation is present).
Call PdfImageObject#getImageAsBytes() which returns JPEG (original), PNG (re-encoded) or TIFF (in case of 8 bits per pixel).
As a result TIFF image with 1 bit color depth is converted to PNG, which is not what I need.
Another approach would be to call PdfImageObject#getBufferedImage() which will decode the image in step (2) into raster and afterwards encode it again as TIFF using ImageIO.write(bufferedImage, "tiff", file).
As one can see this is not efficient. Another solution shown in this post demonstrates how to save encoded TIFF image stream to file by prepending it a TIFF header – that is the solution I am looking for.
Can iText help here?
PDF images are not TIFF images.
PDFs however can contain images that use compression techniques that are also used in TIFF, e.g. Flate, CCITT, LZW, JPEG.

How can i convert a big bmp to a png?

I'm trying to convert a very big bmp file to a png.
I'm writing an app to make fractal image and I want to make a very high resolution image (like ultrahd).
I'll save bitmap pixel image directly into file with RandomAccessFile, so I will not allocate any Bitmap object into memory. The problem will be to convert the temporany bitmap to a png.
I found BitmapRegionDecoder but it is not usefull for my problem.
It is not easy to convert an image without a full data load. :(
I think a good solution could be a method look like: convertToPng(InputStream bitmapData, OutputStream pngStream).
My question is, how can i convert a very big bitmap to a png without have an OutOfMemoryException?
You can try the PNGJ library (disclaimer: I'm the author) which allows to read/write PNG images line by line.

jpeg decoding when data is given in array

i am using LibJpeg library for decoding jpeg image ( given in form of byte array ) into rgb color map .
but it come different from my sample output i want to check by java programme .
how to do this in by java programme ?
what is use of APPn in header ?
how to decode jpeg image into rgb pixel .
Why not use ImageIO.read together with ByteArrayInputStream to read the byte array into an image then no extra library is needed (pure java solution):
BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));

Best way to convert between Image Types in embedded Java?

I'd like to convert (back and forth) the following
- PS to TIFF
- TIFF to PDF
- PDF to TIFF
- GIF to TIFF
- JPEG to TIFF
- TIFF (LZW) to TIFF (CITT G4)
Where, if not specified, TIFF is CITT G4 encoding.
Within embedded code of a Java app; any recommended solutions?
Java supports many formats out of the box and writing the code to do the conversions is simple and straight forward. PDF is not supported as standard however but there are plenty of libraries out there that will decode it - for instance PDF Box.
You can use ImageIO to read & write many image formats. For example, here is how you might convert between a JPEG and Bitmap.
// Read the JPEG
File input = new File("c:/image.jpg");
BufferedImage image = ImageIO.read(input);
// Write the Bitmap
File output = new File("c:/image.bmp");
ImageIO.write(image, "bmp", output);
For ImageIO (more specifically and ImageReader / Writer) to recognize a particular image format, there must exist an ImageReaderSPI & ImageWriterSPI registered with the IIOServiceProvider. So, if you want to use ImageIO to read / write unsupported formats such as PDF, you must write your own implementat6ion or download a library that has them. Writing them is pretty easy, I have done so in the past.

Categories