문제

PNG, JPEG, GIF 파일의 크기를 조정해야 합니다.Java를 사용하여 이 작업을 어떻게 수행할 수 있나요?

도움이 되었습니까?

해결책

이미지를로드 한 후 시도 할 수 있습니다.

BufferedImage createResizedCopy(Image originalImage, 
            int scaledWidth, int scaledHeight, 
            boolean preserveAlpha)
    {
        System.out.println("resizing...");
        int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
        Graphics2D g = scaledBI.createGraphics();
        if (preserveAlpha) {
            g.setComposite(AlphaComposite.Src);
        }
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); 
        g.dispose();
        return scaledBI;
    }

다른 팁

FWIW I 방금 릴리스 (Apache 2, Github에서 호스팅) Java Call의 간단한 이미지 스케일링 라이브러리 imgscalr (사용 가능한 Maven Central).

도서관은 이미지 스케일링에 대한 몇 가지 다른 접근법 (약간의 사소한 개선 사항을 사용한 Chris Campbell의 증분 접근 방식 포함)을 구현하며 요청하면 가장 최적의 접근 방식을 선택하거나 가장 빠르거나 가장 잘 외모를 제공합니다. 그것을 요청하십시오).

사용량은 단순하며 정적 방법에 불과합니다. 가장 간단한 사용 사례는 다음과 같습니다.

BufferedImage scaledImage = Scalr.resize(myImage, 200);

모든 작업은 이미지의 원래 비율을 유지 하므로이 경우 IMGSCALR이 200 픽셀과 200 픽셀의 한계 내에서 이미지 크기를 조정하도록 요청하며 기본적으로 기본적으로 가장 잘 생기고 빠른 접근 방식을 자동으로 선택합니다. 't 지정.

나는 처음에 이것이 자기 홍보처럼 보인다는 것을 알고 있지만 (그렇습니다), 나는이 동일한 주제를 검색하는 데 시간을 공평하게 보냈고 다른 결과/접근/생각/제안을 계속하고 앉아서 앉아서 글을 쓰기로 결정했습니다. 이미지가 있고 이미지가있는 80-85%의 사용 사례를 다루고 가능한 한 빨리 또는 가능한 한 잘 보이게하는 것 (시도한 사람들을 위해 알 수 있습니다. Graphics.DrawImage는 작은 이미지로 이분기적인 보간으로도 여전히 쓰레기처럼 보입니다).

썸네일 레이터 유창한 인터페이스가있는 Java 용 Open-Source 이미지 크기 조정 라이브러리입니다. MIT 라이센스.

Java에서 고품질 썸네일을 만드는 것은 놀랍게도 어려울 수 있으며 결과 코드는 꽤 지저분 할 수 있기 때문에이 도서관을 썼습니다. 썸네일 레이터를 사용하면 간단한 유창한 API를 사용하여 상당히 복잡한 작업을 표현할 수 있습니다.

간단한 예

간단한 예를 들어, 이미지를 가져 와서 100 x 100으로 크기를 조정하고 (원본 이미지의 종횡비를 보존) 파일에 저장하면 단일 문서에서 달성 될 수 있습니다.

Thumbnails.of("path/to/image")
    .size(100, 100)
    .toFile("path/to/thumbnail");

고급 예

복잡한 크기 조정 작업을 수행하는 것은 썸네일 레이터의 유창한 인터페이스로 단순화됩니다.

다음을 수행하고 싶다고 가정 해 봅시다.

  1. 디렉토리에서 이미지를 찍고
  2. 원본 이미지의 종횡비로 100 x 100으로 크기를 조정하십시오.
  3. 품질 설정이있는 JPEG에 모두 저장하십시오 0.85,
  4. 파일 이름이 원본에서 가져온 곳 thumbnail. 처음에 추가되었습니다

Thumbnailator로 번역하면 다음과 같이 위의 내용을 수행 할 수 있습니다.

Thumbnails.of(new File("path/to/directory").listFiles())
    .size(100, 100)
    .outputFormat("JPEG")
    .outputQuality(0.85)
    .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

이미지 품질과 속도에 대한 메모

이 라이브러리도 사용합니다 진행성 이중선 스케일링 강조된 방법 더러운 부자 고객 Chet Haase와 Romain Guy는 고품질 썸네일을 생성하면서 허용 가능한 런타임 성능을 보장합니다.

이를 위해 도서관이 필요하지 않습니다. Java 자체로 할 수 있습니다.

Chris Campbell은 이미지 스케일링에 대한 훌륭하고 상세한 글을 가지고 있습니다. 이 기사.

Chet Haase와 Romain Guy는 또한 책에서 이미지 스케일링에 대한 자세하고 유익한 글을 가지고 있습니다. 더러운 부자 고객.

Java 고급 이미징 이제 오픈 소스이며 필요한 작업을 제공합니다.

큰 이미지를 다루거나 보기 좋은 결과를 원한다면 Java에서는 사소한 작업이 아닙니다.단순히 Graphics2D를 통해 크기 조정 작업을 수행하면 고품질 썸네일이 생성되지 않습니다.JAI를 사용하여 이를 수행할 수 있지만 보기 좋은 것을 얻으려면 상상하는 것보다 더 많은 작업이 필요하며 JAI는 JVM에 OutOfMemory 오류를 발생시키는 불쾌한 습관이 있습니다.

가능하다면 ImageMagick을 외부 실행 파일로 사용하는 것이 좋습니다.사용이 간편하고 작업을 올바르게 수행하므로 따로 작업을 수행할 필요가 없습니다.

Maschine에 Imagemagick을 설치 한 경우 옵션이라면 권장합니다. Im4java. 명령 줄 인터페이스에 매우 얇은 추상화 레이어이지만 매우 잘 작동합니다.

Java API는 이미지 및 다운 그레이드 이미지 품질에 대한 표준 스케일링 기능을 제공하지 않습니다.

이 때문에 나는 Javacv에서 cvresize를 사용하려고했지만 문제를 일으키는 것 같습니다.

이미지 스케일링을위한 좋은 라이브러리를 찾았습니다. pom.xml에 "Java-Image-Scaling"의 종속성을 추가하십시오.

<dependency>
    <groupId>com.mortennobel</groupId>
    <artifactId>java-image-scaling</artifactId>
    <version>0.8.6</version>
</dependency>

Maven 저장소에서는 최근 버전을 얻게됩니다.

전. Java 프로그램에서

ResampleOp resamOp = new ResampleOp(50, 40);
BufferedImage modifiedImage = resamOp.filter(originalBufferedImage, null);

당신은 사용하려고 노력할 수 있습니다 GraphicsMagick 이미지 처리 시스템 ~와 함께 Im4java Java의 Comand-line 인터페이스로.

GraphicsMagick에는 많은 장점이 있지만 모두를위한 이점이 있습니다.

  • GM은 세계 최대의 사진 사이트 (예 : Flickr 및 Etsy)에서 수십억 파일을 처리하는 데 사용됩니다.

이미지 Magick이 언급되었습니다. Jmagick이라는 JNI 프론트 엔드 프로젝트가 있습니다. 그것은 특히 안정적인 프로젝트가 아닙니다 (그리고 이미지 Magick 자체는 많은 변화를 일으키고 호환성을 깨는 것으로 알려져 있습니다). 즉, 우리는 프로덕션 환경에서 Jmagick과 호환 가능한 버전의 Image Magick을 사용하여 높은 처리량이 낮은 대기 시간 속도로 스케일링을 수행했습니다. 우리가 이전에 시도한 모든 Java 그래픽 라이브러리를 사용하면 속도가 실질적으로 더 좋았습니다.

http://www.jmagick.org/index.html

Burkhard의 답변을 사용하기 만하면 그래픽을 만든 후이 줄을 추가하십시오.

    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

값을 Bicubic으로 설정할 수도 있고 더 나은 품질의 이미지를 생성하지만 더 비싼 작업입니다. 설정할 수있는 다른 렌더링 힌트가 있지만 보간이 가장 주목할만한 효과를 얻는다는 것을 알았습니다. 많이 확대하려면 Java 코드가 매우 느릴 가능성이 높습니다. 모든 렌더링 힌트가 품질을 초과하는 속도를 최적화하도록 설정된 경우에도 더 큰 이미지가 지연이 300% Zoom을 생성하기 시작합니다.

이러한 종류의 작업에는 Marvin (Pure Java 이미지 처리 프레임 워크)을 사용할 수 있습니다. http://marvinproject.sourceforge.net

스케일 플러그인 :http://marvinproject.sourceforge.net/en/plugins/scale.html

성능 스케일러를 쓰는 것은 사소한 것이 아닙니다. 오픈 소스 프로젝트를 위해 한 번했습니다. ImagesCaler.

원칙적으로 'java.awt.image#getScaledInstance (int, int, int)도 작업을 수행하지만 이와 관련하여 불쾌한 버그가 있습니다. 자세한 내용은 내 링크를 참조하십시오.

GIF 애니메이션을 처리 할 수있는 자유롭게 사용할 수있는 클래스 (AnimatedGifenCoder, Gifdecoder 및 Lwzencoder)가있는 솔루션을 개발했습니다.
JGifcode Jar를 다운로드하고 GifimageUtil 클래스를 실행할 수 있습니다. 링크: http://www.jgifcode.com

다음과 같은 인기있는 제품을 사용할 수 있습니다. 썸네일 레이터

가져오고 싶지 않다면 imgscalr 내가 테스트 한 위의 @riyad kalla 대답과 마찬가지로 잘 작동합니다. 피터 월저 대답 @peter walser는 또 다른 문제에 대해서는 다음과 같습니다.

 /**
     * utility method to get an icon from the resources of this class
     * @param name the name of the icon
     * @return the icon, or null if the icon wasn't found.
     */
    public Icon getIcon(String name) {
        Icon icon = null;
        URL url = null;
        ImageIcon imgicon = null;
        BufferedImage scaledImage = null;
        try {
            url = getClass().getResource(name);

            icon = new ImageIcon(url);
            if (icon == null) {
                System.out.println("Couldn't find " + url);
            }

            BufferedImage bi = new BufferedImage(
                    icon.getIconWidth(),
                    icon.getIconHeight(),
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = bi.createGraphics();
            // paint the Icon to the BufferedImage.
            icon.paintIcon(null, g, 0,0);
            g.dispose();

            bi = resizeImage(bi,30,30);
            scaledImage = bi;// or replace with this line Scalr.resize(bi, 30,30);
            imgicon = new ImageIcon(scaledImage);

        } catch (Exception e) {
            System.out.println("Couldn't find " + getClass().getName() + "/" + name);
            e.printStackTrace();
        }
        return imgicon;
    }

 public static BufferedImage resizeImage (BufferedImage image, int areaWidth, int areaHeight) {
        float scaleX = (float) areaWidth / image.getWidth();
        float scaleY = (float) areaHeight / image.getHeight();
        float scale = Math.min(scaleX, scaleY);
        int w = Math.round(image.getWidth() * scale);
        int h = Math.round(image.getHeight() * scale);

        int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

        boolean scaleDown = scale < 1;

        if (scaleDown) {
            // multi-pass bilinear div 2
            int currentW = image.getWidth();
            int currentH = image.getHeight();
            BufferedImage resized = image;
            while (currentW > w || currentH > h) {
                currentW = Math.max(w, currentW / 2);
                currentH = Math.max(h, currentH / 2);

                BufferedImage temp = new BufferedImage(currentW, currentH, type);
                Graphics2D g2 = temp.createGraphics();
                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                g2.drawImage(resized, 0, 0, currentW, currentH, null);
                g2.dispose();
                resized = temp;
            }
            return resized;
        } else {
            Object hint = scale > 2 ? RenderingHints.VALUE_INTERPOLATION_BICUBIC : RenderingHints.VALUE_INTERPOLATION_BILINEAR;

            BufferedImage resized = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = resized.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
            g2.drawImage(image, 0, 0, w, h, null);
            g2.dispose();
            return resized;
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top