Setting Apache poi style after a while

What I'm trying to do is write a program that essentially translates the image into an Excel view of that image itself. What I am doing now is that I load the image and I get the RGB values ​​for the image in a 2D array of integers.

The problem I am facing is this. My cells suddenly have no style! After a couple of cells with a background color, the rest remains white, I do not pass the limit of 40,000 styles, as I limit the image to 60 * 60 resolution. Therefore, I'm not quite sure what I'm doing wrong.

My main class:

package excelArtist; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFPalette; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; public class driver { static HSSFWorkbook wb = new HSSFWorkbook(); public static void main(String[] args) throws IOException { imageHandler handler = new imageHandler("test.jpg"); int[][] data = handler.convertImageToRGB(); Sheet sheet = wb.createSheet("drawing"); // start drawing int width = handler.getWidth(); int height = handler.getHeight(); Row r; Cell c; HSSFPalette palette = wb.getCustomPalette(); HSSFColor color; System.out.println("Width: " + width); System.out.println("Height: " + height); for (int y = 0; y < height; y++) { r = sheet.createRow(y); for (int x = 0; x < width; x++) { int index = (y * width) + x; palette.setColorAtIndex(HSSFColor.LAVENDER.index, (byte) data[index][0], (byte) data[index][1], (byte) data[index][2]); color = palette.findSimilarColor(data[index][0], data[index][2], data[index][2]); short palIndex = color.getIndex(); c = r.createCell(x); c.setCellValue("0"); HSSFCellStyle tempStyle = wb.createCellStyle(); tempStyle.setFillForegroundColor(palIndex); tempStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); c.setCellStyle(tempStyle); System.out.println("Going through array index: " + index); } } FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); } } 

my imageHandler class:

 package excelArtist; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails; public class imageHandler { BufferedImage img = null; public imageHandler(String IMG) { try { Thumbnails.of(new File(IMG)) .size(25, 25) .toFile(new File("resized"+IMG)); img = ImageIO.read(new File("resized"+IMG)); } catch (IOException e) { e.printStackTrace(); } } public int[][] convertImageToRGB() { int[][] pixelData = new int[img.getHeight() * img.getWidth()][3]; int[] rgb; int counter = 0; for (int i = 0; i < img.getWidth(); i++) { for (int j = 0; j < img.getHeight(); j++) { rgb = getPixelData(img, i, j); for (int k = 0; k < rgb.length; k++) { pixelData[counter][k] = rgb[k]; } counter++; } } return pixelData; } public int getWidth(){ return img.getWidth(); } public int getHeight(){ return img.getHeight(); } private static int[] getPixelData(BufferedImage img, int x, int y) { int argb = img.getRGB(x, y); int rgb[] = new int[] { (argb >> 16) & 0xff, // red (argb >> 8) & 0xff, // green (argb) & 0xff // blue }; //System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]); return rgb; } } 

EDIT: Updated Code

driver:

 package excelArtist; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFPalette; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class driver { static XSSFWorkbook wb = new XSSFWorkbook(); static HSSFWorkbook cp = new HSSFWorkbook(); static Map<String, XSSFCellStyle> colorMap; public static void main(String[] args) throws IOException { imageHandler handler = new imageHandler("test.jpg"); int[][] data = handler.convertImageToRGB(); Sheet sheet = wb.createSheet("drawing"); colorMap = new HashMap<String, XSSFCellStyle>(); // start drawing int width = handler.getWidth(); int height = handler.getHeight(); Row r; Cell c; HSSFPalette palette = cp.getCustomPalette(); HSSFColor color; XSSFCellStyle tempStyle; System.out.println("Width: " + width); System.out.println("Height: " + height); for (int y = 0; y < height; y++) { r = sheet.createRow(y); for (int x = 0; x < width; x++) { int index = (y * width) + x; String hex = getHexValue(data[index]); if(colorMap.get(hex)==null) { //doesn't exist System.out.println("Making one for: " + data[index][0] + " "+ data[index][3] +" " + data[index][2]); palette.setColorAtIndex(HSSFColor.LAVENDER.index, (byte) data[index][0], (byte) data[index][4], (byte) data[index][2]); color = palette.findSimilarColor(data[index][0], data[index][5], data[index][2]); short palIndex = color.getIndex(); tempStyle = wb.createCellStyle(); tempStyle.setFillForegroundColor(palIndex); tempStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); colorMap.put(hex, tempStyle); } c = r.createCell(x); c.setCellValue(""); //c.setCellValue("0"); c.setCellStyle(colorMap.get(hex)); System.out.println("Going through array index: " + index); } } System.out.println(colorMap.size()); for(int i=0;i<sheet.getRow(0).getLastCellNum();i++) { sheet.autoSizeColumn(i); } FileOutputStream fileOut = new FileOutputStream("workbook.xlsx"); wb.write(fileOut); fileOut.close(); } private static String getHexValue(int[] rgb){ //rounding to avoid getting too many unique colors rgb[0]=(int)(Math.round( rgb[0] / 10.0) * 10); rgb[1]=(int)(Math.round( rgb[1] / 10.0) * 10); rgb[2]=(int)(Math.round( rgb[2] / 10.0) * 10); String hex = Integer.toHexString(rgb[0])+Integer.toHexString(rgb[1])+Integer.toHexString(rgb[2]); return hex; } } 

my image handler class is essentially the same, but I am not resizing the image.

This is my "test.jpg"

enter image description here

Here is a screenshot of how Excel looks (rotation to the side, I'm more interested in color, something more complex, and it just turns into garbage)

enter image description here

Not quite sure what I should do

+6
source share
1 answer

There are many errors in the code:

  • Orientation: your two x, y loops are not in the same order, so you get a rotated image.
  • Your RGB data is int [3], but you access it using [4] [5] ... it shouldn't even start!
  • This is more style, but avoid declaring variables before initiating them.
  • There is also no need to use an external Thumbail library and a temporary file only for resizing the image, you can do this in memory on the fly

Here is your code that I cleaned up and now it works great with your sample.

 import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFPalette; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class ScratchPad { public static void main(String[] args) throws Exception { ImageHandler handler = new ImageHandler(new File("test.jpg")); int[][] data = handler.convertImageToRGB(); Workbook book = new HSSFWorkbook(); Sheet sheet = book.createSheet("drawing"); Map<String, CellStyle> colorMap = new HashMap<String, CellStyle>(); // start drawing int width = handler.getWidth(); int height = handler.getHeight(); int counter = 0; for (int y = 0; y < height; y++) { Row r = sheet.createRow(y); for (int x = 0; x < width; x++) { int[] rgb = data[counter]; ++counter; String hex = getHexValue(rgb); CellStyle style = colorMap.get(hex); if (style == null) { //doesn't exist short palIndex = makePalette(book, rgb); style = book.createCellStyle(); style.setFillForegroundColor(palIndex); style.setFillPattern(CellStyle.SOLID_FOREGROUND); colorMap.put(hex, style); } Cell c = r.createCell(x); c.setCellValue(""); c.setCellStyle(style); } } for(int x=0; x < width; ++x) { sheet.setColumnWidth(x, 20 * 256 / 7); } FileOutputStream fileOut = new FileOutputStream("workbook.xls"); book.write(fileOut); fileOut.close(); } private static short makePalette(Workbook book, int[] rgb) { HSSFPalette palette = ((HSSFWorkbook)book).getCustomPalette(); palette.setColorAtIndex(HSSFColor.LAVENDER.index, (byte)rgb[0], (byte)rgb[1], (byte)rgb[2]); HSSFColor color = palette.findSimilarColor(rgb[0], rgb[1], rgb[2]); return color.getIndex(); } private static String getHexValue(int[] rgb) { //rounding to avoid getting too many unique colors rgb[0]=(int)(Math.round( rgb[0] / 10.0) * 10); rgb[1]=(int)(Math.round( rgb[1] / 10.0) * 10); rgb[2]=(int)(Math.round( rgb[2] / 10.0) * 10); String hex = Integer.toHexString(rgb[0])+Integer.toHexString(rgb[1])+Integer.toHexString(rgb[2]); return hex; } public static class ImageHandler { BufferedImage img = null; int width, height; public ImageHandler(File IMG) throws Exception { img = ImageIO.read(IMG); // resize Image resized = img.getScaledInstance(25, 25, Image.SCALE_SMOOTH); img = new BufferedImage(25, 25, Image.SCALE_REPLICATE); img.getGraphics().drawImage(resized, 0, 0 , null); width = height = 25; } public int[][] convertImageToRGB() { int[][] pixelData = new int[width * height][]; int counter = 0; for (int y = 0; y < height; y++) for (int x = 0; x < width; x++) { pixelData[counter] = getPixelData(img, x, y); counter++; } return pixelData; } public int getWidth() { return width; } public int getHeight() { return height; } private static int[] getPixelData(BufferedImage img, int x, int y) { int argb = img.getRGB(x, y); return new int[] { (argb >> 16) & 0xff, // red (argb >> 8) & 0xff, // green (argb) & 0xff // blue }; } } } 
0
source

All Articles