Изменение размера изображения в разгаре

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

imageLabel.setIcon(newIcon); 

to

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);

person Paul Kar.    schedule 27.11.2011    source источник
comment
1) У вас есть вопрос? 2) Обратите внимание, что все до ImageIcon newIcon = new ImageIcon(bi); — это AWT, а не Swing. 3) Это 'Swing', а не 'swing'. 4) Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 27.11.2011
comment
Хорошо. Я не показываю весь код, потому что он слишком длинный. Кроме того, я не уверен, почему вы говорите, что это Swing, а не Swing (это то, что я получил от автозаполнения, когда ввел тег - я не понимаю, как это моя вина). Я думаю, что это SSCCE. Как я уже сказал, остальная часть кода работает, я уверен, что в этом фрагменте кода есть проблема. Возможно, когда я рисую Изображение, но я не уверен, что именно.   -  person Paul Kar.    schedule 27.11.2011
comment
Я думаю, что это SSCCE. Вы ошибаетесь. Пожалуйста, прочтите документ.   -  person Andrew Thompson    schedule 27.11.2011
comment
Почему бы вам не использовать Image.getScaledInstance()?   -  person Jomoos    schedule 27.11.2011


Ответы (4)


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

    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;  
    }  
person hungneox    schedule 27.11.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();

Проверьте здесь полный пример.

person GETah    schedule 27.11.2011
comment
Если требуется пропорциональная шкала, передайте -1 в качестве аргумента меры, которая должна следовать за другой. Например, если вы хотите масштабировать только по ширине, вы должны вызвать что-то вроде anImage.getScaledInstance(150, -1, java.awt.Image.SCALE_FAST) - person Jaime Hablutzel; 08.05.2014

Попробуйте этот КОД, чтобы изменить размер изображения:

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);
}
person gtiwari333    schedule 27.11.2011

Другой пример приведен здесь:

2D-Graphics/LoadImageandscaleit.htm">http://www.java2s.com/Tutorial/Java/0261_2D-Graphics/LoadImageandscaleit.htm

http://www.java2s.com/Code/JavaAPI/java.awt/ImagegetScaledInstanceintwidthintheightinthints.htm

person gtiwari333    schedule 27.11.2011