반응형


JSP에서 자바 코드를 써서 image orientation을 먼저 알아내고,

orientation 숫자를 기준으로 회전해야 할 각도를 구해서 CSS가 회전을 수행하는 방식이다.



1. 필요한 라이브러리 다운로드 및 적용


이미지의 EXIF 정보에서 orientation을 알아내야 하기 때문에 Metadata-extractor를 쓴다.


[직접 다운로드 또는 사용법 설명]

https://github.com/drewnoakes/metadata-extractor


[Maven]

<dependency>
  <groupId>com.drewnoakes</groupId>
  <artifactId>metadata-extractor</artifactId>
  <version>2.9.1</version>
</dependency>

[Gradle]

 - dependencies에 추가

compile group: 'com.drewnoakes', name: 'metadata-extractor', version: '2.9.1'



2. 소스코드 작성


2-1. Metadata-extractor 기반의 자바 코드:


Java의 File 오브젝트를 사용해서 이미지 파일의 메타데이터 알아내는 Java 클래스를 정의한다.


import java.io.File;

import java.io.IOException;


import com.drew.imaging.ImageMetadataReader;

import com.drew.imaging.ImageProcessingException;

import com.drew.metadata.Directory;

import com.drew.metadata.Metadata;

import com.drew.metadata.MetadataException;

import com.drew.metadata.exif.ExifIFD0Directory;


public class ImageUtil {

/**

* Gets the orientation of an image (usually photo).

* Outputs:

* 6: rotate 90,

* 1: original (no change)

* 3: rotate 180,

* 8: rotate 270,

* others: original (no change)

* @param in a File object to check

* @return orientation value

* @throws IOException

*/

public static int getOrientation(File in) throws IOException {

int orientation = 1;

Metadata metadata;

Directory directory;

try {

metadata = ImageMetadataReader.readMetadata(in);

directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);

if(directory != null){

orientation = directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);

}

} catch (ImageProcessingException e) {

System.err.println("[ImgUtil] could not process image");

e.printStackTrace();

} catch (MetadataException e) {

System.err.println("[ImgUtil] could not get orientation from image");

e.printStackTrace();

}

return orientation;

}

public static int getDegreeForOrientation(int orientation){

int degree = 0;

switch(orientation){

case 6:

degree = 90; break;

case 1:

degree = 0; break;

case 3:

degree = 180; break;

case 8:

degree = 270; break;

default:

degree = 0; break;

}

return degree;

}

}



2-2. CSS 정의


실제로 이미지 회전을 수행하는 CSS 코드를 작성한다. 

html 파일에서 <head> 태그 안에 넣거나, 별도로 쓰는 css파일에 추가한다.


<style type="text/css">

.rotate90 {

   -webkit-transform: rotate(90deg);

   -moz-transform: rotate(90deg);

   -o-transform: rotate(90deg);

   -ms-transform: rotate(90deg);

   transform: rotate(90deg);

}

.rotate180 {

   -webkit-transform: rotate(180deg);

   -moz-transform: rotate(180deg);

   -o-transform: rotate(180deg);

   -ms-transform: rotate(180deg);

   transform: rotate(180deg);

}

.rotate270 {

   -webkit-transform: rotate(270deg);

   -moz-transform: rotate(270deg);

   -o-transform: rotate(270deg);

   -ms-transform: rotate(270deg);

   transform: rotate(270deg);

</style>



2-3. JSP 소스코드


먼저 2-1에서 만든 자바 클래스를 JSP에 import한다.

<%@ page import="ImageUtil이_포함된_패키지_이름.*" %>



<%

String filePath = "이미지_파일의_경로";

File f = new File(filePath);

int orientation = ImageUtil.getOrientation(f);

int degree = ImageUtil.getDegreeForOrientation(orientation);


if(degree != 0){

%>

<img src="이미지_파일의_경로" class="rotate<%=degree%>">

<%

} else {

%>

<img src="이미지_파일의_경로">

<%

}

%>




반응형
블로그 이미지

Bryan_

,
반응형

CSS에서 width, height에 픽셀을 직접 입력하면 항목의 크기가 고정이 되고, 각각을 %로 하면 항목 내부에 높이가 다른 이미지를 다루는 경우에 서로 높이가 달라진다.


width의 경우에는 화면 너비의 %로 지정하고, 그 width와 동일한 값 또는 width의 비율로 표현되는 어떤 값을 height에 적용하고 싶을 때는 vw 단위를 쓸 수 있다.



CSS:


.test {

width: 100vw;

height: 80vw;

}



HTML:


<div class="test">

<img src="......(크기가 서로 다른 이미지)">

</div>



물론 이 방법은 무조건 요소(div)의 크기를 화면 너비에 맞춰서 일정한 비율로 유지하는 데 있으므로, 이미지의 고유한 비율은 당연히 망가지게 된다. 그것을 감수하고 박스 크기를 강제 지정하고 싶을 때 쓰면 될 것 같다. (가령 비디오 플레이어 같은 요소의 크기 지정할 때)




<참고자료>


[1] http://stackoverflow.com/questions/21537806/css-height-same-as-width

[2] https://drafts.csswg.org/css-values/#vw



반응형
블로그 이미지

Bryan_

,