Convert 2D binary matrix to black and white image in java

I am new to java. I have a two-dimensional binary matrix with only 1 and 0. I want to save it as a jpg image (black and white) with the same width and height. How could I understand that? I tried the code below, but could not, saying: "java.lang.IllegalArgumentException: image == null!" Please help me with this or give me a better solution. Thank you very much.

public static void main(String[] args) throws IOException { //result is double[25][33] binary matrix with only 1s and 0s; int height=result.length; int width=result[0].length;; byte[] data = new byte[height*width]; int k=0; for(int i = 0;i < height;i++){ for(int j = 0; j < width; j++){ data[k]=(byte)result[i][j]; k++; } System.out.print("\n"); } InputStream input = new ByteArrayInputStream(data); BufferedImage output = ImageIO.read(input); ImageIO.write(ouput, "jpg", new File("c:/result.jpg")); } 
+6
source share
2 answers

This is a simple example that creates a 30x30 cell:

enter image description here

 public static void main(String... args) throws IOException { int w = 30, h = 30; // create the binary mapping byte BLACK = (byte)0, WHITE = (byte)255; byte[] map = {BLACK, WHITE}; IndexColorModel icm = new IndexColorModel(1, map.length, map, map, map); // create checkered data int[] data = new int[w*h]; for(int i=0; i<w; i++) for(int j=0; j<h; j++) data[i*h + j] = i%4<2 && j%4<2 || i%4>=2 && j%4>=2 ? BLACK:WHITE; // create image from color model and data WritableRaster raster = icm.createCompatibleWritableRaster(w, h); raster.setPixels(0, 0, w, h, data); BufferedImage bi = new BufferedImage(icm, raster, false, null); // output to a file ImageIO.write(bi, "jpg", new File("C:\\Users\\user\\Desktop\\test.jpg")); } 

EDIT:

For what you do, you actually do not need to create your own ImageColorModel, you can use the built-in type: BufferedImage.TYPE_BYTE_GRAY or TYPE_BYTE_BINARY. Here is a better example and shows how to use shades of gray to get a checkered border:

enter image description here

 public static void main(String... args) throws IOException { int w = 40, h = 40, divs = 5; BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); WritableRaster raster = bi.getRaster(); for(int i=0; i<w; i++) for(int j=0; j<h; j++) raster.setSample(i,j,0,128+(int)(127*Math.sin(Math.PI*i/w*divs)*Math.sin(Math.PI*j/h*divs))); ImageIO.write(bi, "jpg", new File("C:\\Users\\user\\Desktop\\test.jpg")); } 
+4
source

JHeatChart does this work without creating its own image library.

http://www.javaheatmap.com/

 // Create some dummy data. double[][] data = new double[][]{{3,2,3,4,5,6}, {2,3,4,5,6,7}, {3,4,5,6,7,6}, {4,5,6,7,6,5}}; // Step 1: Create our heat map chart using our data. HeatChart map = new HeatChart(data); // Step 2: Customise the chart. map.setTitle("This is my heat chart title"); map.setXAxisLabel("X Axis"); map.setYAxisLabel("Y Axis"); // Step 3: Output the chart to a file. map.saveToFile(new File("java-heat-chart.png")); 

What you are basically trying to do is make a heat map. And instead of a range of values ​​from 0 to any, you have a range of 0 and 1.

Replace double[][] data = new double[][](//etc); to your boolean array.

+1
source

Source: https://habr.com/ru/post/959146/


All Articles