Вопрос по image, java – Java - создание формы из рамки вокруг изображения

3

У меня есть класс, который рисует фигуру из изображения PNG, так что я могу использовать фигуру, чтобы нарисовать границу пользовательских кнопок, которые мне нужны для моего проекта. вот код класса для рисования формы изображения:

public class CreateShapeClass {
    public static Area createArea(BufferedImage image, int maxTransparency) {
        Area area = new Area();
        Rectangle rectangle = new Rectangle();
        for (int x = 0; x < image.getWidth(); x++) {
            for (int y = 0; y < image.getHeight(); y++) {
                int rgb = image.getRGB(x, y);
                rgb = rgb >>> 24;
                if (rgb >= maxTransparency) {
                    rectangle.setBounds(x, y, 1, 1);
                    area.add(new Area(rectangle));
                }
            }
        }
        return area;
    }
}

однако, это занимает очень много времени для обработки, и я подумал, что, предварительно нарисовав фигуры в моем основном приложении, а затем сохранив их в массиве и передав в другие классы, это сократит время рендеринга. однако время, затрачиваемое методом paintBorder () для рисования границы кнопки, также занимает довольно много времени (хотя оно и меньше, чем время, необходимое для рисования фигуры), поскольку форма, сгенерированная классом выше, заполнена, а не пустой. Я пытался рисовать фигуры, используя java2d, например, Ellipse2D, и рендеринг кнопки занимает очень короткое время. Кто-нибудь, имеющий опыт в этой области, может научить меня, как создать форму, которая является границей BufferedImage? Я использую класс выше, чтобы создать форму из PNG-изображения с прозрачным фоном.

Рад, что вы получили это отсортировано. :) Я ввел комментарии как ответ, пожалуйстаaccept это когда у тебя есть шанс. Andrew Thompson
извините, вы можете помочь мне увидеть, какие части используются для получения плана? Я не очень хорошо знаком с формами и тому подобным: csharpnewbie
ах, хорошо, я получил это спасибо! во всяком случае, этот метод действительно очень быстрый по сравнению с классом, который я использовал выше ... результат получается менее чем за секунду! в отличие от описанного выше метода, который занимает около + -13 секунд для обработки. еще раз спасибо! csharpnewbie

Ваш Ответ

1   ответ
5

Сглаживание зубчатой дорожка. Алгоритм получения (грубого) контура был относительно быстрым в окончательных версиях. СозданиеGeneralPath удивительно быстрее, чем добавлениеArea объекты.

Важной частью является этот метод:

public Area getOutline(Color target, BufferedImage bi) {
    // construct the GeneralPath
    GeneralPath gp = new GeneralPath();

    boolean cont = false;
    int targetRGB = target.getRGB();
    for (int xx=0; xx<bi.getWidth(); xx++) {
        for (int yy=0; yy<bi.getHeight(); yy++) {
            if (bi.getRGB(xx,yy)==targetRGB) {
                if (cont) {
                    gp.lineTo(xx,yy);
                    gp.lineTo(xx,yy+1);
                    gp.lineTo(xx+1,yy+1);
                    gp.lineTo(xx+1,yy);
                    gp.lineTo(xx,yy);
                } else {
                    gp.moveTo(xx,yy);
                }
                cont = true;
            } else {
                cont = false;
            }
        }
        cont = false;
    }
    gp.closePath();

    // construct the Area from the GP & return it
    return new Area(gp);
}
Error: User Rate Limit Exceeded
"I tried to implement something like this.."Error: User Rate Limit ExceededcontError: User Rate Limit ExceededMCVEError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded csharpnewbie
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededmoveToError: User Rate Limit Exceededif(first) { gp.moveTo(xx,yy); first = false; } else { gp.lineTo(xx,yy); }Error: User Rate Limit Exceeded

Похожие вопросы