Java를 사용하여 이미지 크기를 조정하려면 어떻게 해야 합니까?
PNG, JPEG 및 GIF 파일의 크기를 조정해야 합니다.Java를 사용하여 이 작업을 수행하려면 어떻게 해야 합니까?
FWIW I는 방금 (Apache 2, GitHub에서 호스팅됨)imgscalr (Maven Central에서 사용 가능)이라는 자바용 심플한 이미지 스케일링 라이브러리를 출시했습니다.
라이브러리에서는 이미지 스케일링에 대해 몇 가지 다른 접근법(Chris Campbell의 증분 접근법 포함)을 구현하고 있으며, 고객이 원하는 경우 가장 적합한 접근법 또는 가장 빠른 접근법 또는 가장 보기 좋은 접근법(필요한 경우)을 선택할 수 있습니다.
사용법은 아주 간단합니다.정적인 방법들이 많이 있을 뿐입니다.가장 간단한 사용 사례는 다음과 같습니다.
BufferedImage scaledImage = Scalr.resize(myImage, 200);
모든 작업은 이미지의 원래 비율을 유지하므로 이 경우 imgscalr에게 가로 200픽셀, 세로 200픽셀 범위 내에서 이미지의 크기를 조정하도록 요청해야 합니다.기본적으로 이 작업은 지정되지 않았기 때문에 가장 보기 좋고 빠른 방법을 자동으로 선택합니다.
처음에는 이것이 자기 홍보처럼 보이지만(그것은 사실이지만) 저는 이 같은 주제를 검색하는데 많은 시간을 할애하여 다양한 결과/접근법/생각/제안을 계속 생각해 냈습니다.그리고 80-85%의 사용 사례를 이미지화하고 싶은 경우에 대처하는 간단한 구현을 작성하기로 결정했습니다.움브네일 - 가능한 한 빨리, 또는 가능한 한 잘 보이게(BICUBIC 보간법을 사용해도 그래픽스.draw이미지를 충분히 작은 이미지로 보간해도 여전히 가비지처럼 보입니다).
이미지를 로드한 후 다음을 시도할 수 있습니다.
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;
}
Thumbnailator는 MIT 라이선스에 따라 배포되는 유연한 인터페이스를 갖춘 Java용 오픈 소스 이미지 크기 조정 라이브러리입니다.
자바에서 고품질의 썸네일을 만드는 것은 의외로 어렵고, 그 결과 코드가 매우 복잡해질 수 있기 때문에 이 라이브러리를 작성했습니다.Thumbnailator를 사용하면 간단한 유창한 API를 사용하여 상당히 복잡한 작업을 표현할 수 있습니다.
간단한 예
간단한 예로서 이미지를 캡처하여 (원래 이미지의 애스펙트 비율을 유지) 100 x 100으로 크기를 조정하여 파일에 저장하면 단일 문장으로 다음과 같은 작업을 수행할 수 있습니다.
Thumbnails.of("path/to/image")
.size(100, 100)
.toFile("path/to/thumbnail");
고도의 예
Thumbnailator의 유연한 인터페이스를 통해 복잡한 크기 조정 작업을 단순화할 수 있습니다.
예를 들어 다음과 같습니다.
- 디렉토리내의 이미지를 촬영해,
- 원래 이미지의 가로 세로 비율을 사용하여 100 x 100으로 크기를 조정합니다.
- 이 JPEG인
0.85
, - 입니다.
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의 Dough Rich Clients에서 강조된 점진적인 쌍선형 스케일링 방법을 사용하여 런타임 성능을 허용하면서 고품질 썸네일을 생성합니다.
이렇게 하기 위해 도서관이 필요하지 않습니다.Java 자체로도 할 수 있습니다.
Chris Campbell은 스케일링 이미지에 대한 훌륭하고 상세한 기록을 가지고 있습니다. 이 문서를 참조하십시오.
Chet Haase와 Romain Guy는 또한 이미지 스케일링에 대한 상세하고 매우 유용한 정보를 그들의 책인 Dirty Rich Clients에 기록하고 있습니다.
Java Advanced Imaging은 이제 오픈 소스이며 필요한 작업을 제공합니다.
큰 이미지를 다루거나 멋진 결과를 원한다면 자바에서는 간단한 작업이 아닙니다.Graphics2D를 사용한 스케일 변경 조작만으로 고품질의 섬네일을 만들 수 없습니다.JAI를 사용하면 가능하지만, 보기 좋은 것을 얻으려면 생각보다 많은 작업이 필요합니다.JAI는 Out Of Memory 오류로 인해 JVM을 망가뜨리는 나쁜 버릇이 있습니다.
Image Magick을 외부 실행 파일로 사용하는 것이 좋습니다.사용하기 쉽고, 올바르게 동작하기 때문에, 번거롭지 않습니다.
만약 당신의 매스킨에 Imagemagick을 설치하는 것이 옵션이라면 im4java를 추천합니다.명령줄 인터페이스 상의 매우 얇은 추상화 레이어이지만 매우 잘 작동합니다.
Java API는 이미지의 표준 스케일링 기능과 이미지 품질 다운그레이드 기능을 제공하지 않습니다.
그래서 자바CV에서 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);
Java의 커맨드라인 인터페이스로서 im4java를 탑재한 GraphicsMagick Image Processing System을 사용해 볼 수 있습니다.
Graphics Magick에는 많은 장점이 있지만, 그 중 하나는 다음과 같습니다.
- GM은 세계에서 가장 큰 사진 사이트(예: Flickr 및 Etsy)에서 수십억 개의 파일을 처리하는 데 사용됩니다.
이미지 매직이 언급되었습니다.JNI 프런트 엔드 프로젝트 JMagick이 있습니다.이 프로젝트는 특별히 안정적인 프로젝트는 아닙니다(Image Magick 자체는 크게 변화하고 호환성도 깨지는 것으로 알려져 있습니다).즉, 프로덕션 환경에서 JMagick과 호환되는 버전의 Image Magick을 사용하여 높은 throughput과 낮은 레이텐시 속도로 확장을 수행할 수 있었습니다.이전에 시도했던 모든 Java 그래픽 라이브러리를 사용하는 것보다 속도가 훨씬 향상되었습니다.
http://www.jmagick.org/index.html
Burkhard의 답변을 사용하지만 그래픽을 작성한 후 다음 행을 추가합니다.
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
값을 BICUBIC로 설정할 수도 있습니다.더 좋은 품질의 이미지를 만들 수 있지만 비용이 많이 드는 작업입니다.설정할 수 있는 다른 렌더링 힌트가 있지만 보간법이 가장 주목할 만한 효과를 낸다는 것을 알게 되었습니다.많은 부분을 확대하려면 Java 코드가 매우 느릴 수 있습니다.모든 렌더링 힌트가 품질보다 빠른 속도로 최적화되도록 설정되어 있어도 큰 이미지는 약 300%의 줌 지연을 일으키기 시작합니다.
이러한 종류의 조작에는, Marvin(순수한 Java 이미지 처리 프레임워크)를 사용할 수 있습니다.http://marvinproject.sourceforge.net
스케일 플러그인: http://marvinproject.sourceforge.net/en/plugins/scale.html
퍼포먼스 스케일러를 작성하는 것은 간단한 일이 아니라는 것이 판명되었습니다.오픈 소스 프로젝트에서 한 번 해봤습니다.ImageScaler.
원칙적으로 'java.awt'입니다.Image #getScaledInstance(int, int, int)'도 동작합니다만, 이것에는 고약한 버그가 있습니다.자세한 것은 링크를 참조해 주세요.
GIF 애니메이션을 취급할 수 있는 무료 클래스(Animated Gif Encoder, Gif Decoder, LWZEncoder)를 갖춘 솔루션을 개발했습니다.
jgifcode jar를 다운로드하여 GifImageUtil 클래스를 실행할 수 있습니다.링크: http://www.jgifcode.com
자주 사용하는 제품: 썸네일레이터
위에서 테스트한 @Riyad Kalla answer와 같은 imgScalr를 Import하고 싶지 않은 경우 Peter Walser @Peter Walser 님의 다른 문제에 대한 답변을 참고하여 ImgScalr을 Import할 수 있습니다.
/**
* 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;
}
}
다음 방법을 사용해 보십시오.
ImageIcon icon = new ImageIcon("image.png");
Image img = icon.getImage();
Image newImg = img.getScaledInstance(350, 350, java.evt.Image.SCALE_SMOOTH);
icon = new ImageIcon(img);
JOptionPane.showMessageDialog(null, "image on The frame", "Display Image", JOptionPane.INFORMATION_MESSAGE, icon);
를 사용할 수도 있습니다.
Process p = Runtime.getRuntime().exec("convert " + origPath + " -resize 75% -quality 70 " + largePath + "");
p.waitFor();
언급URL : https://stackoverflow.com/questions/244164/how-can-i-resize-an-image-using-java
'programing' 카테고리의 다른 글
Java를 사용하여 SSH를 통해 원격 MySQL 데이터베이스에 연결 (0) | 2022.09.26 |
---|---|
vue 구성 요소를 글로벌하게 등록하는 중 (0) | 2022.09.19 |
Django 모델에서 mySQL ENUM 지정 (0) | 2022.09.19 |
Larabel Alturnal의 "With()" 함수를 사용하여 특정 열 가져오기 (0) | 2022.09.19 |
MYSQL_ROOT_PASSWORD 환경변수가 mariadb 컨테이너에 설정되어 있지 않다. (0) | 2022.09.19 |