Java: convert image to byte array, convert byte array to image
There are many situations where we need to convert an image to a byte array. The following are the java code for converting an image to a byte array, and then convert byte array back to image. I have tested it under Java 1.5, it should work without any problem. Please leave your comment, if there is any problem. I write this code is because I want to make a centralized file upload module, which uses Web Service to do file transfer. Although Web Service is not good for transferring large files, images are normally smaller, and therefore are OK to transfer this way. On one side, the image is converted to an array of byte, and is sent to the other side. Then the other side convert the array back to an image. If you are interested in transferring images using Web Service, Please read my previous post about this topic. Here is a post about the solution of using Web Service to transfer files.
import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Iterator; import java.util.logging.Level; import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; public class ConvertImage { public static void main(String[] args) throws FileNotFoundException, IOException { /* * In this function the first part shows how to convert an image file to * byte array. The second part of the code shows how to change byte array * back to a image */ File file = new File("C:\\rose.jpg"); System.out.println(file.exists() + "!!"); FileInputStream fis = new FileInputStream(file); //create FileInputStream which obtains input bytes from a file in a file system //FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader. //InputStream in = resource.openStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; try { for (int readNum; (readNum = fis.read(buf)) != -1;) { bos.write(buf, 0, readNum); //no doubt here is 0 /*Writes len bytes from the specified byte array starting at offset off to this byte array output stream.*/ System.out.println("read " + readNum + " bytes,"); } } catch (IOException ex) { Logger.getLogger(ConvertImage.class.getName()).log(Level.SEVERE, null, ex); } byte[] bytes = bos.toByteArray(); //bytes is the ByteArray we need /* * The second part shows how to convert byte array back to an image file */ //Before is how to change ByteArray back to Image ByteArrayInputStream bis = new ByteArrayInputStream(bytes); Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg"); //ImageIO is a class containing static convenience methods for locating ImageReaders //and ImageWriters, and performing simple encoding and decoding. ImageReader reader = (ImageReader) readers.next(); Object source = bis; // File or InputStream, it seems file is OK ImageInputStream iis = ImageIO.createImageInputStream(source); //Returns an ImageInputStream that will take its input from the given Object reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); Image image = reader.read(0, param); //got an image file BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); //bufferedImage is the RenderedImage to be written Graphics2D g2 = bufferedImage.createGraphics(); g2.drawImage(image, null, null); File imageFile = new File("C:\\newrose2.jpg"); ImageIO.write(bufferedImage, "jpg", imageFile); //"jpg" is the format of the image //imageFile is the file to be written to. System.out.println(imageFile.getPath()); } }
The following is a simple version which has exactly the same function. It uses the BufferedImage class, which is a proved more efficient way.
import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; public class SimpleConvertImage { public static void main(String[] args) throws IOException{ String dirName="C:\\"; ByteArrayOutputStream baos=new ByteArrayOutputStream(1000); BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg")); ImageIO.write(img, "jpg", baos); baos.flush(); String base64String=Base64.encode(baos.toByteArray()); baos.close(); byte[] bytearray = Base64.decode(base64String); //Why use Base64 decode? BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray)); ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg")); } }
Related posts:
Leave a comment
Comments(10)
SA
Hi Thank you for this declration
am working on this class from two hour ago but i need to seprate store of image from creation method so i read image and convert it to byte array then decoded by base 64 then insert in file
then terminate
then run module to create image which read file then decode string by base 64 then ask for image io to write image i got nullpointer exception
thanks it really helps
Thank you sooooo much!
This helped me decode an image byte array sent from flash. So awesome.
really this s very help to me
thanks to u..
keep it up..
good job ….thanks for your help…
yes …this world is because of helpful guys like you….
Really nice tips..
Keep continue mate.
Thank you so much.
Absolutley new to java, althought love to read articles from witch I can learn
thnx..it helped me a lot..!!
than you sir…
Some days ago we downloaded some real ringtones with the help of the free ringtones company and used to be definitely satisfied.