2015-11-26 5 views
0

Я пытаюсь написать программу, которая просто создает изображение из текста (например, напишите «привет» на белом квадрате и сохраните изображение), что звучит просто, но это нужно сделать быстро. Я попробовал библиотеку Java2D, но для рисования на BufferedImage требуется ~ 2 секунды, чтобы просто нарисовать изображение, даже не сохранять и не отображать его. Я также пытался использовать генераторы CAPTCHA на Java, но они занимают слишком много времени (5 секунд).Java: Самый быстрый способ рисования текста?

Это кажется довольно простой задачей просто нарисовать текст, но я расстроен тем, что не могу сделать это быстрее, чем на 2 секунды.

Есть ли способ, которым я могу сделать это быстрее на своей машине с помощью некоторых параметров командной строки (например, выделение большего объема памяти или приоритета)? Есть ли определенная библиотека Java, которую я должен использовать, или какая-то странная причуда для Java2D, о которой я должен знать, чтобы ускорить работу?

Это моя вся программа. Я бегу это в Eclipse:

import java.awt.*; 
import java.awt.image.BufferedImage; 

public class SimpleGraphics { 
    public static void main(String[] args) { 
     long time = System.currentTimeMillis(); 

     String message = "Hello world"; 
     int width = 100; 
     int height = 100; 
     BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 

     Graphics2D graphics = img.createGraphics(); 
     graphics.setColor(Color.black); 
     graphics.setFont(new Font("TimesRoman", Font.BOLD, 12)); 

     FontMetrics fontMetrics = graphics.getFontMetrics(); 
     int stringWidth = fontMetrics.stringWidth(message); 
     int stringHeight = fontMetrics.getAscent(); 

     graphics.drawString(message, (width - stringWidth)/2, height/2 + stringHeight/4); 
     System.out.println(System.currentTimeMillis() - time); //consistently ~2 seconds 
    } 
} 
+2

Для выполнения каких-либо основных графических работ или ввода-вывода файлов не требуется 2 секунды. Отправьте свой [SSCCE] (http://sscce.org/), который демонстрирует проблему, чтобы мы могли точно видеть, что вы делаете. Я не вижу ничего плохого в базовом коде, который вы опубликовали, но важно, как вы используете код. – camickr

+0

Этот код буквально все внутри моего основного метода. Я запускаю это в Eclipse. – Booley

+1

Ну тогда буквально скопируйте весь код, разместив его на форуме. Например, как вы вычисляете «2 секунды»? Если мы не сможем запустить код, мы не знаем, является ли проблема вашим кодом или вашей машиной. В течение 2 секунд загрузка JVM не будет фактическим временем рисования. – camickr

ответ

2

я запускаю мой код из командной строки (используя JDK8 на Windows 7), и я получаю около 300 мс.

Я изменил свой код на следующее:

import java.awt.*; 
import java.awt.image.BufferedImage; 

public class SimpleGraphics { 
    public static void main(String[] args) { 
     long time = System.currentTimeMillis(); 

     for (int i = 0; i < 100; i++) 
      createImage(); 

     System.out.println(System.currentTimeMillis() - time); //consistently ~2 seconds 
    } 

    public static void createImage() 
    { 
     String message = "Hello world"; 
     int width = 100; 
     int height = 100; 
     BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 

     Graphics2D graphics = img.createGraphics(); 
     graphics.setColor(Color.black); 
     graphics.setFont(new Font("TimesRoman", Font.BOLD, 12)); 

     FontMetrics fontMetrics = graphics.getFontMetrics(); 
     int stringWidth = fontMetrics.stringWidth(message); 
     int stringHeight = fontMetrics.getAscent(); 

     graphics.drawString(message, (width - stringWidth)/2, height/2 + stringHeight/4); 
    } 
} 

Я все еще получаю около 300мс.

Таким образом, проблема заключается не в цветовом коде.

Я не знаю, почему вы получаете 2 секунды, но, очевидно, есть некоторые накладные расходы для загрузки класса. Поэтому все, что я могу предложить, - это сделать ваше создание изображений партиями, чтобы свести к минимуму время.

+0

Я замечаю, что когда я запускаю партии, первое изображение занимает 2 секунды для загрузки, но все остальное <10 мс; приятно знать, что это проблема с загрузкой классов, а не с самим кодом, но по-прежнему нецелесообразно делать партии. Что-то не так с моей java/машиной? – Booley

+0

Не знаю, является ли это вашей машиной IDE, платформой или версией Java. – camickr

+0

Могу ли я спросить, какую IDE/версию вы используете? (версия IDE, то есть) – Booley

0

Сроки каждой линии индивидуально дают большой прыжок на fontMetrics - так что есть ваш преступник. Я не знаю, предоставит ли вам другие измерительные классы (lineMetrics) более короткое время

import java.awt.*; 
import java.awt.image.BufferedImage; 

public class SimpleGraphics { 
public static void main(String[] args) { 
    long time = System.currentTimeMillis(); 

    String message = "Hello world"; 
    int width = 100; 
    int height = 100; 
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); 
    System.out.println(System.currentTimeMillis() - time); //consistently ~2 seconds 

    Graphics2D graphics = img.createGraphics(); 
    graphics.setColor(Color.black); 
    graphics.setFont(new Font("TimesRoman", Font.BOLD, 12)); 
    System.out.println("1 "+(System.currentTimeMillis() - time)); //consistently ~2 seconds 

    FontMetrics fontMetrics = graphics.getFontMetrics(); 
    System.out.println("2 "+(System.currentTimeMillis() - time)); //consistently ~2 seconds 
    int stringWidth = fontMetrics.stringWidth(message); 
    System.out.println("3 "+(System.currentTimeMillis() - time)); //consistently ~2 seconds 
    int stringHeight = fontMetrics.getAscent(); 
    System.out.println(System.currentTimeMillis() - time); //consistently ~2 seconds 

    graphics.drawString(message, (width - stringWidth)/2, height/2 + stringHeight/4); 
    System.out.println(System.currentTimeMillis() - time); //consistently ~2 seconds 
} 
} 
Смежные вопросы