반응형

간단한 프로젝트를 진행하는 중 이미지들의 용량 문제 + 썸네일을 만들기 위하여 이미지를 리사이징 해야할 일이 생겼습니다...
간단하게 파일입출력을 이용하여 이미지를 읽고, 지정한 사이즈로 원하는 경로에 이미지를 생성하는 코드를 코틀린으로 만들었습니다.

이미지가 깨지지 않도록 압축을 하기위해서는 별도의 설정이 필요하지만... 우선 그냥 모든 이미지를 100 * 100로 맞추도록 코드를 짰습니다. 수정하면 원하는 크기로 리사이징이 가능!


동작과정

읽을 이미지들이 담겨있는 디렉터리와 리사이즈된 이미지들을 저장할 디렉터리를 지정해주면 이미지들이 담겨있는 디렉터리의 모든 이미지들을 읽은 후 지정한 너비, 높이로 리사이징하여 설정해놓은 경로에 저장됩니다! 

 

ps. 아래의 코드는 원본 파일의 이름을 그대로 사용하기 때문에(ex img1234.jpg) 원본의 확장자로 저장이 되는 듯함.

ps2. ImageIO의 reader, writer가 지원하는 확장자 목록

http://www.java2s.com/Code/Java/2D-Graphics-GUI/ListAllreaderandwriterformatssupportedbyImageIO.htm

코드

import java.awt.image.BufferedImage
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.InputStream
import javax.imageio.ImageIO


fun main() {

    // 파일의 경로
    // TODO - 읽을 이미지가 들어있는 디렉터리의 경로를 지정
    val path = "/Users/hyunsoo/Desktop/코코jpg"
    // 파일 객체 생성
    val file = File(path)
    // 파일을 생성할 경로
    // TODO - 리사이징할 이미지를 쓸 경로를 지정
    val outputPath = "/Users/hyunsoo/Desktop/"
    // 해당 경로의 모든 파일 탐색
    file.walk().forEach {
        // 파일이 아니거나 .DS_Store 파일일 경우 무시
        // TODO - 특정 확장자를 명시해줘도 좋을 것 같음.
        if (!it.isFile || it.toString().contains(".DS_")) return@forEach
        // 파일의 이름(동일한 파일명으로 저장하기 위함)
        val fileName = it.name
        // 파일들을 바이트 스트림으로 읽기 위해 FileInputStream 객체 생성
        val imgInputStream = FileInputStream(it)
        // 리사이징된 이미지
        // TODO - 두 번째 인자로 너비 지정, 세 번째 인자로 높이 지정
        val bufferedImage = resize(imgInputStream, 100, 100)
        // 지정한 경로 + 파일의 이름으로 파일 생성하기 위한 FileOutputStream 객체 생성
        val imgOutputStream = FileOutputStream(outputPath + fileName)
        // bufferedImage를 jpeg 포멧으로 FileOutputStream를 통해 저장.
        ImageIO.write(bufferedImage, "jpeg", imgOutputStream)
        println("${it.name} 리사이즈 완료")
    }

}

// InputStream 이미지를 지정한 높이, 너비만큼 크기를 조정해서 BufferedImage 로 반환
fun resize(inputStream: InputStream, width: Int, height: Int): BufferedImage {
    // 리사이즈 대상 이미지 읽기
    val originImage = ImageIO.read(inputStream)

    // 원본 사진의 높이, 너비
//    println("${inputImage.height} ${inputImage.width}")

    // 지정한 사이즈의 이미지를 담을 bufferedImage 생성
    val resizedImage = BufferedImage(width, height, originImage.type)
    // 생성한 이미지에 요청한 크기의 이미지를 그리기
    val graphics = resizedImage.createGraphics()
    graphics.drawImage(originImage, 0, 0, width, height, null)
    graphics.dispose()

    return resizedImage
}

참고

https://velog.io/@sorakim92/Java-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A6%AC%EC%82%AC%EC%9D%B4%EC%A7%95%EC%9A%A9%EB%9F%89

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기