Изменение размера изображения в разгаре - PullRequest
5 голосов
/ 27 ноября 2011

У меня есть фрагмент кода, который я использую для изменения размера изображения до размера занавеса (я хочу изменить разрешение на что-то вроде 200 dpi). В основном, причина, по которой мне это нужно, заключается в том, что я хочу отобразить выбранное пользователем изображение (несколько большое), а затем, если пользователь одобряет, я хочу показать то же изображение в другом месте, но с меньшим разрешением. К сожалению, если я дам ему большое изображение, на экране ничего не появится. Также, если я изменю

imageLabel.setIcon(newIcon); 

до

imageLabel.setIcon(icon); 

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

Image img = icon.getImage();

BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
boolean myBool = g.drawImage(img, 0, 0, 100, 100, null);
System.out.println(myBool);
ImageIcon newIcon = new ImageIcon(bi);
imageLabel.setIcon(newIcon);
submitText.setText(currentImagePath);
imageThirdPanel.add(imageLabel);

Ответы [ 4 ]

9 голосов
/ 27 ноября 2011

Вам не нужно заботиться о деталях масштабирования изображений. Класс Image уже имеет метод getScaledInstance(int width, int height, int hints), разработанный для этой цели. Документация Java гласит:

Создает уменьшенную версию этого изображения. Новый объект Image возвращается который будет рендерить изображение на указанной ширине и высоте дефолт. Новый объект Image может быть загружен асинхронно, даже если Исходное изображение уже полностью загружено. Если либо ширина или высота - отрицательное число, затем подставляется значение для сохранения соотношения сторон исходного изображения.

И вы можете использовать его так:

// Scale Down the original image fast
Image scaledImage = imageToScale.getScaledInstance(newWidth, newHighth, Image.SCALE_FAST);
// Repaint this component
repaint();

Проверьте это для полного примера.

6 голосов
/ 27 ноября 2011

Вот мое решение:

    private BufferedImage resizeImage(BufferedImage originalImage, int width, int height, int type) throws IOException {  
        BufferedImage resizedImage = new BufferedImage(width, height, type);  
        Graphics2D g = resizedImage.createGraphics();  
        g.drawImage(originalImage, 0, 0, width, height, null);  
        g.dispose();  
        return resizedImage;  
    }  
1 голос
/ 27 ноября 2011

Попробуйте этот код для изменения размера изображения:

public static Image scaleImage(Image original, int newWidth, int newHeight) {
    //do nothing if new and old resolutions are same
    if (original.getWidth() == newWidth && original.getHeight() == newHeight) {
        return original;
    }

    int[] rawInput = new int[original.getHeight() * original.getWidth()];
    original.getRGB(rawInput, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight());
    int[] rawOutput = new int[newWidth * newHeight];
    // YD compensates for the x loop by subtracting the width back out
    int YD = (original.getHeight() / newHeight) * original.getWidth() - original.getWidth();
    int YR = original.getHeight() % newHeight;
    int XD = original.getWidth() / newWidth;
    int XR = original.getWidth() % newWidth;
    int outOffset = 0;
    int inOffset = 0;
    for (int y = newHeight, YE = 0; y > 0; y--) {
        for (int x = newWidth, XE = 0; x > 0; x--) {
            rawOutput[outOffset++] = rawInput[inOffset];
            inOffset += XD;
            XE += XR;
            if (XE >= newWidth) {
                XE -= newWidth;
                inOffset++;
            }
        }
        inOffset += YD;
        YE += YR;
        if (YE >= newHeight) {
            YE -= newHeight;
            inOffset += original.getWidth();
        }
    }
    return Image.createRGBImage(rawOutput, newWidth, newHeight, false);
}
0 голосов
/ 27 ноября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...