我必须用Java创建一个小工具。 我有一项任务是将一个文本(单个字母)渲染到一个屏幕图像,并计算指定矩形内的所有白色和黑色像素。
/***************************************************************************
* Calculate black to white ratio for a given font and letters
**************************************************************************/
private static double calculateFactor(final Font font,
final Map<Character, Double> charWeights) {
final char[] chars = new char[1];
double factor = 0.0;
for (final Map.Entry<Character, Double> entry : charWeights.entrySet()) {
final BufferedImage image = new BufferedImage(height, width,
BufferedImage.TYPE_INT_ARGB);
chars[0] = entry.getKey();
final Graphics graphics = image.getGraphics();
graphics.setFont(font);
graphics.setColor(Color.black);
graphics.drawChars(chars, 0, 1, 0, 0);
final double ratio = calculateBlackRatio(image.getRaster());
factor += (ratio * entry.getValue());
}
return factor / charWeights.size();
}
/***************************************************************************
* Count ration raster
**************************************************************************/
private static double calculateBlackRatio(final Raster raster) {
final int maxX = raster.getMinX() + raster.getWidth();
final int maxY = raster.getMinY() + raster.getHeight();
int blackCounter = 0;
int whiteCounter = 0;
for (int indexY = raster.getMinY(); indexY < maxY; ++indexY) {
for (int indexX = raster.getMinX(); indexX < maxX; ++indexX) {
final int color = raster.getSample(indexX, indexY, 0);
if (color == 0) {
++blackCounter;
} else {
++whiteCounter;
}
}
}
return blackCounter / (double) whiteCounter;
}
问题是raster.getSample总是返回0.
我做错了什么?
答案 0 :(得分:2)
也许char不是绘制到图像上的。如果我没记错,.drawChars()方法会绘制到Y-baseline。所以你认为你必须将字体高度添加到Y值。
答案 1 :(得分:2)
如果我没弄错,你在x = 0,y = 0处绘制字符,其中x,y是“此图形上下文坐标系中第一个字符的基线。”
由于基线位于字符的底部,因此您可以在上方图像中绘制它们。
使用x = 0,y =高度
此外,正确的构造函数是:BufferedImage(int width, int height, int imageType)
:您反转宽度和高度。
答案 2 :(得分:1)
好的PhiLho的鼻子Waverick的答案是正确的。 此外,我必须清除背景并将字体颜色更改为黑色:)
final Graphics graphics = image.getGraphics();
graphics.setFont(font);
graphics.setColor(Color.white);
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.black);
graphics.drawChars(chars, 0, 1, 0, height);