일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스프링 메일 전송
- 스프링 포트폴리오
- 로그인 기능
- 스프링 게시판
- 회원가입 기능
- 스프링 쇼핑몰
- 스프링 업로드
- 인증번호 전송
- 쇼핑몰 포트폴리오
- 스프링 프로젝트 설정
- ResponseEntity
- 로그아웃 기능 구현
- oracle 설치방법
- 정규표현식
- arraylist
- 스프링 HikariCP
- 스프링 프로젝트
- spring 쇼핑몰
- 삭제 구현
- spring 프로젝트
- 스프링 이미지
- 파일 업로드
- 스프링 게시판 구현
- Bcrypt
- 스프링 파일 삭제
- 이미지 출력
- 스프링 쇼핑몰 프로젝트
- BCrypt 적용
- 쇼핑몰 프로젝트
- 스프링 프로젝트 기본 설정
- Today
- Total
Kim VamPa
[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(썸네일 생성 및 저장) - 5 본문
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188
목표
썸네일 이미지 생성 및 저장
저번 포스팅에서 이미지 저장까지 구현을 하였습니다. 앞으로 저장한 이미지를 호출하여 홈페이지 화면에 띄우는 것을 구현을 할 것입니다. 하나의 페이지에 저장된 이미지가 한 개인 경우 크게 문제는 없습니다. 하지만 이미지가 여러 개인 경우 특히 저장된 이미지가 용량이 큰 경우 홈페이지를 운영하는 사람과 홈페이지를 사용하는 사람 모두에게 부담이 됩니다.
홈페이지를 운영하는 사람의 입장에서는 이미지를 많이 호출하는 것은 트래픽 량을 많이 소모하는 원인이 됩니다. 서버를 대여해서 운영하는 운영자 입장에서 트래픽 량에 따라 비용이 달라지기 때문에 민감한 사항입니다.
홈페이지를 사용하는 사람입장에서 데스크톱, 노트북으로 이용하는 경우는 부담이 좀 덜하겠지만, 휴대폰을 통해 특히 와이파이를 통하지 않고 이미지를 많이 호출하는 페이지로 이동할 경우 로딩 시간과 데이터 소모량이 많게 됩니다.
원본 이미지를 보여주는 것이 아니라 원본보다 크기를 줄인 이미지, 즉 썸네일 이미지를 홈페이지에 보여준다면 이러한 문제점을 다소 보완 할 수 있습니다. 원본을 사용자가 보길 원하는 경우 이미지를 클릭하는 것과 같은 이벤트를 통해 볼 수 있도록 해주면 될 것입니다.
따라서 이번 포스팅에서는 추후 이미지 호출 시 썸네일 이미지를 호출 할 수 있도록 원본 이미지를 통해 썸네일 이미지를 생성하고 저장하는 것을 목표로 합니다.
썸네일 이미지를 만들기 위해 Java 에서 자체적으로 제공하는 ImageIO를 이용하거나 간단히 썸네일 이미지를 만들 수 있도록 도와주는 Scalar, Thumbnailator 등 을 이용하는 방법이 있습니다. 이번 포스팅에선 ImageIO와 Thumbnailator을 통한 썸네일 이미지 작업을 해 볼 것입니다.
순서
0. 방향
1. 썸네일 생성 및 저장(ImageIO)
2. 테스트
0. 방향
썸네일 이미지를 저장을 실행하는 코드는 앞선 포스팅에서 작성한 이미지 파일을 저장하는 코드에 이어서 작성할 것입니다.
저장될 썸네일 이미지의 경우 기존 원본 파일이름("uuid_원본파일이름")에서 앞에 "s_"를 붙여 줄 것입니다. 다시 말해 썸네일 이미지는 다음과 같은 형태의 구성을 가집니다.
"s_" + "uuid_" + "원본파일 이름. 이미지 타입"
1. 썸네일 생성 및 저장 (ImageIO)
ImageIO를 통해서 썸네일을 만들기 위해서 ImageIO, BufferedImage, Graphics2D 클래스를 사용할 것입니다. 각 클래스에 대해 간략히 설명하면 ImageIO 클래스는 이미지를 읽어오거나 생성(작성?) 할 수 있도록 도와주는 메서드 입니다. BufferedImage의 경우 이미지 데이터를 처리하거나 조작에 필요한 값과 메서드를 제공합니다. Graphics2D의 경우 그림을 그리는데 필요로 한 설정값과 메서드를 제공하는 클래스입니다.
ImageIO도 결국 입출력에 관한 클래스 이기 때문에 해당 클래스의 메서드들은 IllegalArgumentException, IOException 을 일으킬 가능성이 있습니다. 따라서 저번 포스팅에서 파일 저장을 위해 작성 한 코드(multipartFile.transferTo)를 감싸고 있는 try catch문 구현부에 이어서 작성할 것입니다.
ImageIO를 통해 썸네일을 만들기 위해선 먼저 원본 파일의 File 객체와 썸네일 이미지 파일의 File 객체가 필요로 합니다. 원본 이미지의 File 객체는 앞서 작성해 놓았기 때문에(File saveFile) 썸네일 이미지 파일 객체를 만들어 줄 것입니다.
File 타입의 참조 변수를 선언하여 썸네일 이미지 File 객체로 초기화 해줍니다. 목차 0에서 썸네일의 이미지는 "s_"+"이미지 이름"으로 작성되도록 하였기 때문에 다음과 같이 작성하였습니다.
File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
원본 이미지 파일을 ImageIO의 read() 메서드를 호출하여 BufferedImage 타입으로 변경 해준 뒤 BufferedImage 타입의 참조 변수를 선언하여 해당 변수에 대입해줍니다. (bo_image 변수는 buffered original image라는 의미로 작성을 하였는데 자신이 원하는 변수명을 설정하시면 됩니다.)
File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
BufferedImage bo_image = ImageIO.read(saveFile);
BuffedImage 생성자를 사용하여 썸네일 이미지인 BuffedImage 객체를 생성해주고 참조 변수에 대입합니다. (이 과정은 일종의 크기를 지정하여 흰색 도화지를 만드는 것과 같습니다. )
File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
BufferedImage bo_image = ImageIO.read(saveFile);
BufferedImage bt_image = new BufferedImage(300, 500, BufferedImage.TYPE_3BYTE_BGR);
사용한 BufferedImage 생성자는 매개변수로 '넓이', '높이', '생성될 이미지의 타입'을 작성하면 됩니다.
'생성될 이미지의 타입' 경우 int 형 값인데 BufferedImage 클래스가 가지고 있는 필드 값 들 중 자신이 필요로 한 타입을 선택해서 작성을 하면 됩니다. (Java BufferedImage API)
썸네일 BufferedImage 객체(bt_image)에서 createGraphics() 메서드를 호출을 통해 Graphic2D 객체를 생성 해준 후 Graphic2D 타입의 참조 변수에 대입합니다.(앞서 만든 도화지에 그림을 그릴 수 있도록 하는 과정이라고 생각하시면 됩니다.)
썸네일 BufferedImage 객체에 그림을 그리기 위해 Grahpic2D 객체를 생성하였습니다. Grahpic2D메서드를 통해 조작을 하게 되면 그 결과가 썸네일 BufferedImage 객체 적용이 됩니다.
File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
BufferedImage bo_image = ImageIO.read(saveFile);
BufferedImage bt_image = new BufferedImage(300, 500, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D graphic = bt_image.createGraphics();
drawImage 메서드를 호출하여 원본 이미지(원본 BuffedImage)를 썸네일 BufferedImage에 지정한 크기로 변경하여 왼쪽 상단 "0, 0" 좌표부터 그려줍니다. ( 도화지에 이미지를 그리는 과정이라고 생각하시면 됩니다.)
File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
BufferedImage bo_image = ImageIO.read(saveFile);
BufferedImage bt_image = new BufferedImage(300, 500, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D graphic = bt_image.createGraphics();
graphic.drawImage(bo_image, 0, 0,300,500, null);
draowImage 메서드의 첫 번째 인자는 그려놓고자 하는 이미지입니다.
두 번째, 세 번째 인자는 그림을 어느 좌표부터 그릴 것인지에 대한 'x'값과 'y'값입니다. (좌 상단 맨 끝점이 "0, 0"입니다.)
네 번째, 다섯 번째 인자 값은 첫 번째 인자로 작성한 이미지의 '넓이'와 '높이'입니다. 지정한 '넓이'와 '높이'로 이미지 크기가 확대 혹은 축소되고, 크기가 변경된 이미지가 그려지게 됩니다.
여섯 번째 인자는 ImageObserver 객체입니다. ImageObserver는 이미지의 정보를 전달받아서 이미지를 업데이트시키는 역할을 합니다. 일반적인 경우 null을 전달하면 됩니다.
제작한 썸네일 이미지(bt_image)를 이제 파일로 만들어줄 차례입니다. ImageIO의 write 메서드를 호출하여 파일로 저장합니다.
File thumbnailFile = new File(uploadPath, "s_" + uploadFileName);
BufferedImage bo_image = ImageIO.read(saveFile);
BufferedImage bt_image = new BufferedImage(300, 500, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D graphic = bt_image.createGraphics();
graphic.drawImage(bo_image, 0, 0,300,500, null);
ImageIO.write(bt_image, "jpg", thumbnailFile);
write() 메서드의 첫 번째 인자는 파일로 저장할 이미지입니다. 우리가 만든 썸네일 이미지(bt_image)를 인자로 부여합니다. 두 번째 인자는 어떠한 이미지 형식으로 저장할 것인지 String 타입으로 작성합니다. 'jpg', 'png' 등 자신이 원하는 형식을 지정합니다. 세 번째 인자는 우리가 앞서 썸네일 이미지가 저장될 경로와 이름으로 생성한 File 객체(thumbnailFile)를 부여하면 됩니다.
복잡해 보이지만 전체적인 과정을 요약하면 Java내에서 크기를 지정한 이미지를 만들고, 그 이미지에 맞게 원본 이미지를 그려 넣은 다음 해당 이미지를 파일로 저장한 것입니다.
2. 테스트
서버를 구동시켜 원본 이미지와 더불어 썸네일 이미지가 저장이 되는지 확인합니다.
※글이 길어져서 다음 포스팅에서 이어서 진행합니다. 이번 포스팅에서 작성한 ImageIO를 활용한 썸네일 생성 및 저장 코드를 조금 더 보완하겠습니다. 더불어 thumbnailator 라이브러리를 활용하여 썸네일 이미지를 생성 및 저장을 구현할 것입니다.
REFERENCE
- docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawImage(java.awt.Image,%20int,%20int,%20int,%20int,%20java.awt.image.ImageObserver)
- docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html
- blog.daum.net/clamp83/56
- movefast.tistory.com/47
- docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#write(java.awt.image.RenderedImage,%20java.lang.String,%20java.io.File)
- docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html#BufferedImage(int,%20int,%20int)
DATE
- 2020.05.13
'스프링 프레임워크 > 쇼핑몰 프로젝트' 카테고리의 다른 글
[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(이미지 정보 뷰 반환 - 1) - 6 (5) | 2021.05.17 |
---|---|
[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(썸네일 생성 및 저장-2) - 5 (0) | 2021.05.14 |
[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(파일 저장) - 4 (1) | 2021.05.11 |
[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(저장 폴더 생성) - 3 (0) | 2021.05.10 |
[Spring][쇼핑몰 프로젝트][24] 상품 이미지 업로드(파일 서버 전송) - 2 (8) | 2021.05.05 |