>Java >java지도 시간 >JLabel의 이미지 크기를 효율적으로 조정하여 크기에 맞추거나 채우는 방법은 무엇입니까?

JLabel의 이미지 크기를 효율적으로 조정하여 크기에 맞추거나 채우는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-30 21:15:16218검색

How to Efficiently Scale Images in a JLabel to Fit or Fill its Dimensions?

JLabel의 자동 이미지 크기 조정

JLabel을 사용하여 JFrame 내에서 이미지를 표시할 때 이미지 크기가 일관되지 않는 상황이 발생할 수 있습니다. JLabel 내에서 이미지의 크기를 균일하게 조정하고 맞추려면 다음 접근 방식을 활용할 수 있습니다.

getScaledInstance 사용 방지

Image.getScaledInstance가 일반적인 선택이지만 그렇지 않습니다. 가장 효율적이거나 최고 품질의 옵션입니다. 대신, 속도와 이미지 선명도를 모두 높이기 위해 사용자 정의 구성 요소를 생성할 수 있습니다.

크기 조정 방법 결정

크기 조정 방법을 유연하게 선택할 수 있습니다. "toFit"으로 화면 비율을 유지하고 싶거나 "toFill"로 사용 가능한 공간을 완전히 채우고 싶습니다.

Custom 확장 가능한 이미지용 구성 요소

다음 사용자 정의 구성 요소인 ScalablePane을 사용하면 크기 조정 모드를 설정하고 레이블 크기에 따라 이미지 크기를 자동으로 조정할 수 있습니다.

public class ScalablePane extends JPanel {
    // Scaled image
    private Image scaled;
    // Scaling mode: fit or fill
    private boolean toFit;

    // Constructor with image and scaling mode
    public ScalablePane(Image master, boolean toFit) {
        this.toFit = toFit;
        generateScaledInstance(); // Initial scaling
    }

    // Override getPreferredSize to return master image size
    @Override
    public Dimension getPreferredSize() {
        return master == null ? super.getPreferredSize() : new Dimension(master.getWidth(this), master.getHeight(this));
    }

    // Override paintComponent to draw the scaled image
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(scaled, 0, 0, this); 
    }

    // Generate the scaled image based on the scaling mode
    protected void generateScaledInstance() {
        if (isToFit()) {
            scaled = getScaledInstanceToFit(master, getSize());
        } else {
            scaled = getScaledInstanceToFill(master, getSize());
        }
    }

    // Generate toFit image
    protected Image getScaledInstanceToFit(Image master, Dimension size) {
        Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));
        return getScaledInstance(master, getScaleFactorToFit(masterSize, size));
    }

    // Generate toFill instance 
    protected Image getScaledInstanceToFill(Image master, Dimension size) {
        Dimension masterSize = new Dimension(master.getWidth(this), master.getHeight(this));
        return getScaledInstance(master, getScaleFactorToFill(masterSize, size));
    }

    // Actual scaling logic
    protected Image getScaledInstance(Image master, double scaleFactor) {
        BufferedImage img = toBufferedImage(master);
        return getScaledInstance(img, scaleFactor, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
    }
    // ... additional helper methods and utility functions omitted for brevity
}

사용 방법

이 접근 방식을 사용하려면 원하는 ScalablePane 인스턴스를 생성하세요. 이미지 및 크기 조정 모드를 라벨에 추가한 다음 원하는 라벨 크기를 설정하세요. 사용자 정의 구성 요소는 필요에 따라 이미지의 크기를 자동으로 조정하고 표시합니다.

ImageIcon img = new ImageIcon("res.png");
JLabel label = new JLabel(img);
label.setPreferredSize(new Dimension(200, 100));
label.add(new ScalablePane(img, true));

이 사용자 정의 구성 요소를 활용하면 JLabel의 크기에 맞게 자동으로 효율적으로 이미지 크기를 조정할 수 있으므로 어떤 경우에도 일관된 이미지 표현을 보장할 수 있습니다. 원래 크기입니다.

위 내용은 JLabel의 이미지 크기를 효율적으로 조정하여 크기에 맞추거나 채우는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.