我想要做的是编写一个程序,该程序基本上将图像转换为该图像的Excel表示。我现在正在做的是我正在加载图像,并且我将图像的RGB值变为2D整数数组。
我面临的问题是这个。我的细胞突然没有造型!在几个具有背景颜色的单元格之后,其余的单元格保持白色,我没有超过4,0000样式限制,因为我将图像限制为60 * 60分辨率。所以我不太确定我做错了什么。
我的主要课程:
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();
}
}
我的imageHandler类:
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;
}
}
编辑:新更新的代码
驱动器:
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;
}
}
我的图像处理程序类基本相同,但我没有调整图像大小。
这是我的&#34; test.jpg&#34;
这里是excel看起来的截图(旋转一边,我更关心颜色,更复杂,它只是变成垃圾)
不完全确定我应该做什么
答案 0 :(得分:0)
您的代码中存在许多错误:
这是我清理过的代码,现在它可以很好地处理您的示例图像。
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
};
}
}
}