Почему мой рендеринг закадрового изображения не работает? - PullRequest
0 голосов
/ 27 января 2010

Мне нужно создать небольшой инструмент на 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.

Что я сделал не так?

Ответы [ 3 ]

2 голосов
/ 27 января 2010

Если я не ошибаюсь, вы рисуете символы в x = 0, y = 0, где x, y равны " Базовая линия первого символа [...] в системе координат этого графического контекста." Поскольку базовая линия находится внизу символов, вы рисуете их над изображением. Используйте x = 0, y = высота.
Кроме того, правильный конструктор: BufferedImage(int width, int height, int imageType): вы перевернули ширину и высоту.

2 голосов
/ 27 января 2010

Возможно, символ вообще не рисует изображение. Если я правильно помню, метод .drawChars () обращается к Y-базовой линии. Так что вы, я думаю, вы должны добавить высоту шрифта к значению Y.

1 голос
/ 27 января 2010

ОК. Ответы Филиппа и Вейверика были правильными. Кроме того, мне пришлось очистить фон и изменить цвет шрифта на черный:)

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...