Как улучшить производительность метода g.drawImage () для изменения размера изображений - PullRequest
47 голосов
/ 19 октября 2010

У меня есть приложение, в котором пользователи могут загружать изображения в альбомы, но естественно размер загружаемых изображений должен быть изменен, чтобы были также доступны большие пальцы и показанные изображения также помещались на странице (например, 800x600).То, как я делаю изменение размера, выглядит следующим образом:

Image scaledImage = img.getScaledInstance((int)width, (int)height, Image.SCALE_SMOOTH);
BufferedImage imageBuff = new BufferedImage((int)width, (int)height, BufferedImage.TYPE_INT_RGB);
Graphics g = imageBuff.createGraphics();
g.drawImage(scaledImage, 0, 0, new Color(0,0,0), null);
g.dispose();

И все работает нормально.Моя единственная проблема заключается в том, что метод g.drawImage() кажется очень медленным, и я просто не могу себе представить, что пользователь будет достаточно терпеливым, чтобы дождаться загрузки 20 снимков 20 * 10 секунд ~ 3 минуты.На самом деле, на моем компьютере требуется почти 40 секунд для создания трех разных размеров для одного изображения.

Этого недостаточно, и я ищу более быстрое решение.Мне интересно, может ли кто-нибудь рассказать мне о лучшем в Java ИЛИ, вызвав сценарий оболочки, команду, что бы вы ни взломали, это должно быть быстрее, на этот раз все остальное не имеет значения.

Ответы [ 12 ]

0 голосов
/ 20 марта 2014

Я использовал im4java с GraphicsMagick , чтобы получить действительно более быстрые результаты (быстрее, чем ImageIO).

Использовал такой код:

public static void createFilePreview(final File originalFile, final String originalFileMimeType, final File destinationPreviewFile, final Integer maxWidth, final Integer maxHeight) throws IOException, InterruptedException, IM4JavaException {
    runThumbnail(new ConvertCmd(), originalFile.getAbsolutePath(), originalFileMimeType, destinationPreviewFile.getAbsolutePath(), maxWidth, maxHeight);
}

public static void createFilePreview(final InputStream originalFileInputStream, final String originalFileMimeType, final File destinationPreviewFile, final Integer maxWidth, final Integer maxHeight) throws IOException, InterruptedException, IM4JavaException {
    final ConvertCmd cmd = new ConvertCmd();

    cmd.setInputProvider(new Pipe(originalFileInputStream, null));

    runThumbnail(cmd, "-", originalFileMimeType, destinationPreviewFile.getAbsolutePath(), maxWidth, maxHeight);
}

private static void runThumbnail(final ConvertCmd cmd, final String originalFile, final String originalFileMimeType, final String destinationPreviewFile, final Integer maxWidth, final Integer maxHeight) throws IOException, InterruptedException, IM4JavaException {
    final IMOperation operation = new IMOperation();
    // if it is a PDF, will add some optional parameters to get nicer results
    if (originalFileMimeType.startsWith("application/pdf")) {
        operation.define("pdf:use-trimbox=true");   // as it is said here http://www.prepressure.com/pdf/basics/page_boxes "The imposition programs and workflows that I know all use the TrimBox as the basis for positioning pages on a press sheet."
        operation.density(300, 300);    // augment the rendering from 75 (screen size) to 300 dpi in order to create big preview with good quality
    }
    operation.addImage("[0]");  // if it is a PDF or other multiple image source, will extract the first page / image, else it is ignored
    operation.autoOrient(); // Auto-orient the image if it contains some orientation information (typically JPEG with EXIF header)
    operation.thumbnail(maxWidth, maxHeight);
    operation.addImage();

    cmd.run(operation, originalFile, destinationPreviewFile);
}
0 голосов
/ 19 октября 2010

Если вы хотите что-то быстрое, вы, вероятно, лучше с некоторым собственным кодом, если вы можете отказаться от переносимости.

Но если вы хотите чисто Java-решение, вы можете попробовать и другие решениякак Graphics2D.scale и Image.getScaledInstance .Я использовал их в прошлом, но не могу вспомнить, какие из них имели лучшую производительность или лучше выглядели, извините.

Попробуйте их и посмотрите, какой из них лучше всего соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...