본문 바로가기

공부/컴퓨터

클래스를 이용하지 않고 gif 정보 구하기

반응형
==========================================================================
이 글은 이론적으로 아는 것을 직접 설명 및 구현을 해 봄으로써 제 자신의
실력을 다지기 위한 글 입니다. 물론 정확한 이론. 용어도 아님을 밝힙니다.
이 글을 직.간접적으로 사용함으로써 발생되는 모든 불이익을 책임지지 않습니다.

문의점, 오류, 잘못된 용어들은 저의 홈페이지 Work 게시판을 이용하여 주시고
이상의 사항에 대하여는 최대한 덧글 ( 코멘트 ) 를 이용해 주십시오.

본 글은 저의 홈페이지인 http://ggaman.com 과
싸이월드의 (JPSC) JAVA program study club 에서 보실수 있습니다.

homepage : http://ggaman.com e-mail n MSN : chan at ggaman.com

200300904 - Chan
==========================================================================

자세한 설명은 소스에 포함 되어 있습니다.




001: /*
002: * Created on 2003-09-04
003: *
004: * To change the template for this generated file go to
005: * Window>Preferences>Java>Code Generation>Code and Comments
006: */
007:
008: import java.io.*;
009:
010: /**
011: * @author Chan
012: *
013: * To change the template for this generated type comment go to
014: * Window>Preferences>Java>Code Generation>Code and Comments
015: */
016: public class GifInfo {
017:        
018:         int width = 0;                        // 그림의 넓이를 저장할 변수
019:         int height = 0;                        // 그림의 높이를 저장할 변수
020:         int left = 0;                        // 그림의 왼쪽 시작점을 저장할 변수
021:         int top = 0;                        // 그림의 오른쪽 시작점을 저장할 변수
022:         boolean usingLocalColorMap = false;        // 사용자 정의 칼라 맵의 사용 여부
023:         boolean interlace = false;                        // 인터레이스의 여부
024:        
025:         byte temp[] = new byte[2];
026:         int temp2;        
027:        
028:        
029:         File f;
030:         FileInputStream fs;
031:        
032:         /** Gif에서 이미지의 정보는 가장 앞에 위치하는 나오는
033:          *
034:          * "," ( 0x2C) 다음에 순서대로 배치되게 되어 있다.
035:          *
036:          * , 뒤의
037:          *     처음의 2byte는 그림의 왼쪽 시작 위치,
038:          *     다음 2byte는 그림의 위쪽 시작 위치,
039:          *     다음 2byte는 그림의 넓이(폭),
040:          *     다음 2byte는 그림의 높이,
041:          *     다음의 1 byte에서
042:          *        상위 1bit는 LocalColorMap 의 사용 여부
043:          *        다음 1bit는 인터레이스의 유무
044:          *        다음 1bit는 sort의 유무 ( ColorMap 사용시 색깔순으로 정렬 부분 )
045:          *        다음 2bit는 예약 되어 있고 ( 차후를 위해서 남겨 준것 같음 )
046:          *        다음 3bit는 LocalColorMap의 사이즈가 들어 간다.  
047:          */
048:         GifInfo(File f) {
049:                 try {
050:                         this.f = f;
051:                         fs = new FileInputStream(this.f);
052:                        
053:                         // 0x2C가 나올때까지 read로 통과 시킴
054:                         while(fs.read() != Byte.parseByte("44"));
055:
056:
057:                         // 2byte를 읽어 들여서 비트 연산을 통해서
058:                         // 2byte 형의 값을 int 형으로 만든다.
059:                         // 여기서 보면 두번째 값( temp[1] )을
060:                         // 상위로 보내고 첫번째 값( temp[0] )을 하위에 붙여서
061:                         // int 형으로 만드는데 , 이는 저장될때 반대로 저장되었기 때문에
062:                         // 거꾸로 값을 붙여 주어서 제대로 만드는 부분이다.
063:                        
064:                         // 그림의 왼쪽 시작 위치 구함.
065:                         fs.read(temp);
066:                         left = left | temp[1];
067:                         left = left << 8;
068:                         left = left | temp[0];
069:
070:
071:                         // 그림의 위쪽 시작 위치 구함.
072:                         fs.read(temp);
073:                         top = top | temp[1];
074:                         top = top << 8;
075:                         top = top | temp[0];
076:                        
077:                         // 그림의 넓이 구함
078:                         fs.read(temp);
079:                         width = width | temp[1];
080:                         width = width << 8;
081:                         width = width | temp[0];
082:
083:                         // 그림의 높이 구함
084:                         fs.read(temp);
085:                         height = height | temp[1];
086:                         height = height << 8;
087:                         height = height | temp[0];
088:
089:
090:                         // 마지막으로 1byte의 값을 bit AND 연산 시켜서
091:                         // 각 자리의 값을 확인하고 설정해 준다.
092:                         temp2 = fs.read();
093:                         if ( (temp2 & 64)  == 64 ) interlace = true;
094:                         else if ( (temp2 & 128 ) == 128) usingLocalColorMap = true;
095:
096:
097:                 }catch(Exception e){
098:                         System.out.println(e.toString());
099:                 }
100:                
101:         }
102:         /** 그림 이름 리턴 */
103:         public String getGifFileName() {
104:                 return f.getName();
105:         }
106:        
107:         /** 그림의 넓이(폭) 리턴 */
108:         public int getWidth() {
109:                 return width;
110:         }
111:
112:         /** 그림의 높이 리턴 */
113:         public int getHeight() {
114:                 return height;                
115:         }
116:
117:         /** 그림의 인터레이스 유무 리턴 */
118:         public boolean isInterlace() {
119:                 return interlace;
120:         }
121:        
122:         /** 그림의 LocalColorMap 사용 유무 리턴 */
123:         public boolean isLocalColorMap() {
124:                 return usingLocalColorMap;
125:         }
126:
127:        
128:         public static void main(String[] args) {
129:                 File f = new File("c:\\a.gif");
130:                 GifInfo gi = new GifInfo(f);
131:                
132:                 System.out.println("그림의 이름은 : "+gi.getGifFileName());
133:                 System.out.println("그림의 높이는 : " +gi.getHeight());
134:                 System.out.println("그림의 넓이는 : " +gi.getWidth());
135:                 System.out.print("인터레이스 유무 : ");
136:                 if ( gi.isInterlace() ){
137:                         System.out.println("인터레이스");
138:                 } else {
139:                         System.out.println("인터레이스 아님");
140:                 }
141:                
142:                 System.out.print("LocalColorMap 사용 유무 : ");
143:                 if (gi.isLocalColorMap()) {
144:                         System.out.println("사용");
145:                 } else {
146:                         System.out.println("미사용");
147:                 }
148:         }
149: }

반응형

'공부 > 컴퓨터' 카테고리의 다른 글

Thread 과 Runnable의 비교.  (2) 2003.09.13
객체지향 설계 쉽게 생각하기  (0) 2003.09.05
더블 링크드 리스트  (0) 2003.09.04
환형 Queue  (0) 2003.08.28
Queue  (0) 2003.08.27