Получение "родного размера" изображения, созданного с помощью JLabel - PullRequest
1 голос
/ 23 января 2012

Я использую JLabel для создания файла изображения из строки.

Я должен указать размеры изображения (label.setSize(width, height)), в противном случае я получаю исключение:

java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:338)
    at com.shopsnips.portal.services.ImageCreator.createFromText(ImageCreator.java:31)
    at com.shopsnips.portal.services.ImageCreator.main(ImageCreator.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

Я могу контролировать размер шрифта, используя

label.setFont(new Font("Serif", Font.BOLD, 26));

Когда я использую шрифт или текст, который слишком велик, чтобы соответствовать фиксированным размерам, ярлык усекается, и вместо него включается «...». Есть ли способ определить оптимальный / максимальный размер шрифта, который по-прежнему соответствует размерам, которые я установил?

Или, альтернативно, как я могу узнать, будут ли текущие настройки (размер шрифта + размеры) вызывать усечение текста?

Вот некоторый источник:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class ImageCreator {
    private ImageCreator(){}

    private final static String FONT = "Freestyle Script";

    public static void main(String[] args) {
        Path outputFile = Paths.get("c:\\tmp\\img\\test.png");

        createFromText("Hello World - this is a long text", outputFile, 150, 50);
    }

    /**
* <p>Create an image from text. <p/>
* <p/>
* https://stackoverflow.com/a/4437998/11236
*/
    public static void createFromText(String text, Path outputFile, int width, int height) {
        JLabel label = new JLabel(text, SwingConstants.CENTER);
        label.setSize(width, height);
        label.setFont(new Font(FONT, Font.BOLD, 24));

        BufferedImage image = new BufferedImage(
                label.getWidth(), label.getHeight(),
                BufferedImage.TYPE_INT_ARGB);

        Graphics g = null;
        try {
            // paint the html to an image
            g = image.getGraphics();
            g.setColor(Color.BLACK);
            label.paint(g);
        } finally {
            if (g != null) {
                g.dispose();
            }
        }

        // get the byte array of the image (as jpeg)
        try {
            ImageIO.write(image, "png", outputFile.toFile());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

Пожалуйста, войдите, чтобы комментировать.

Ответы [ 3 ]

2 голосов
/ 24 января 2012

label.setFont(new Font("Serif", Font.BOLD, 26)); ..Есть ли способ определить оптимальный / максимальный размер шрифта, который по-прежнему соответствует размерам, которые я установил?

Для получения размера текста см. FontMetrics или GlyphVector.

«Быстрый и грязный» способ получить размер текста - это поместить его в метку и запросить метку для предпочтительного размера.

С учетом этих цифр размер шрифта можно соответствующим образом скорректировать.

2 голосов
/ 23 января 2012

1) положить BuferedImage как значок в JLabel ,

2) не setSize разрешить эту работу для LayoutManager

3) ответ @Jeffrey был слишком близок к правильному ответу, BuferedImage, если существует, может вернуть оба измерения

4) для более быстрой помощи, пожалуйста, опубликуйте SSCCE , потому что я / мы не видим ни кода на вашем мониторе, ни исключений, сгенерированных из ваших классов Java

0 голосов
/ 07 февраля 2012

Мне не нравится ни один из приведенных ответов (или их недостаточно подробно, чтобы я мог использовать их прямо сейчас).

Вместо этого я просто использовал эту эвристику, чтобы выбрать размер шрифта:

private static int chooseFontSize(String text) {
    int largeFont = 28;
    int mediumFont = 22;
    int tinyFont = 16;
    if (text.length() > 25) {
        return tinyFont;
    }
    if (text.length() > 15) {
        return mediumFont;
    }
    return largeFont;
}
...