뮤텍스 : 뮤텍스는 화장실에 들어가기 위한 열쇠로 비유할 수 있습니다. 즉 화장실에 들어갈 수 있는 열쇠를 한 사람이 갖고 있다면, 한 번에 열쇠를 갖고 있는 그 한 사람만이 들어갈 수 있습니다. 화장실에 열쇠를 갖고 있는 사람이 들어가 볼일을 다 본 후에는 줄을 서서 기다리고 있는(대기열-큐) 다음 사람에게 열쇠를 주게 됩니다.  

 

공식적인 정의(심비안 개발자 라이브러리에서 발췌) : 뮤텍스는 한 번에 하나의 쓰레드만이 실행되도록 하는 재 입장할 수 있는 코드 섹션에 직렬화된  접근이 가능하게 할 때 사용됩니다. 뮤텍스 객체는 제어되는 섹션에 하나의 쓰레드만을 허용하기 때문에 해당 섹션에 접근하려는 다른 쓰레드들을 강제적으로 막음으로써 첫 번째 쓰레드가 해당 섹션을 빠져나올 때까지 기다리도록 합니다.

 

뮤텍스는 값이 1인 세마포어입니다.

 

세마포어: 세마포어는 빈 화장실 열쇠의 갯수라고 보면 됩니다. 즉, 네 개의 화장실에 자물쇠와 열쇠가 있다고 한다면 세마포어는 열쇠의 갯수를 계산하고 시작할 때 4의 값을 갖습니다. 이 때는 이용할 수 있는 화장실 수가 동등하게 됩니다. 이제 화장실에 사람이 들어갈 때마다 숫자는 줄어들게 됩니다. 4개의 화장실에 사람들이 모두 들어가게 되면 남은 열쇠가 없게 되기 때문에 세마포어 카운트가 0이 됩니다. 이제 다시 한 사람이 화장실에서 볼일을 다 보고 나온다면 세마포어의 카운트는 1이 증가됩니다. 따라서 열쇠 하나가 사용가능하기 때문에 줄을 서서 기다리고 있는 다음 사람이 화장실에 입장할 수 있게 됩니다.

 

공식적인 정의(심비안 개발자 라이브러리에서 발췌): 세마포어는 공유 리소스에 접근할 수 있는 최대 허용치만큼 동시에 사용자 접근을 할 수 있게 합니다. 쓰레드들은 리소스 접근을 요청할 수 있고 세마포어에서는 카운트가 하나씩 줄어들게 되며 리소스 사용을 마쳤다는 신호를 보내면 세마포어 카운트가 하나 늘어나게 됩니다.

 

원본 위치 <http://blog.naver.com/PostView.nhn?blogId=cabsoft88&logNo=90115377264&beginTime=0&jumpingVid=&from=search&redirect=Log&widgetTypeCall=true&topReferer=http%3A%2F%2Fsearch.naver.com%2Fsearch.naver%3Fsm%3Dtab_hty.top%26where%3Dnexearch%26ie%3Dutf8%26query%3D%25EC%2593%25B0%25EB%25A0%2588%25EB%2593%259C%2B%25EB%25AE%25A4%25ED%2585%258D%25EC%258A%25A4%2B%25EC%2584%25B8%25EB%25A7%2588%25ED%258F%25AC%25EC%2596%25B4%26x%3D0%26y%3D0


그림으로 쓰레드에 대한 설명이 잘 되어있음. http://comfun.tistory.com/694

'Application Programming' 카테고리의 다른 글

Bitmap 구조 2  (0) 2010.01.18
Bitmap 구조 1  (0) 2010.01.18
Posted by Finebe
,



var vector:Vector.<String> = Vector:<String>(["test1","test2","test3"]);

벡터는 배열보다 속도, 관리, 접근 등에 더 효율적이여서 자주 씁니다.

변경: hika님의 댓글로 인하여 변경하였습니다. 감사합니다.

'Application Programming > Flex & Flash' 카테고리의 다른 글

Browser's RIA Data Loading Benchmarks  (0) 2010.10.02
Flash AMF 의 개요  (0) 2010.03.08
Flex Builder 3에 JSON적용하기  (2) 2010.01.13
Posted by Finebe
,


RIA에서 Data Loading은 중요한 요소입니다. 대부분이 서버와 데이터연동을 통하기 때문입니다.
어떤 Data Format이 좋을까 고민할 수도 있습니다. HTTP, SOAP, XML, Dojo, JSON, AMF3등 중에서도 자주 쓰이는 방식은  HTTP, XML,  JSON, AMF3등이 있습니다. 지금 알아볼려고 하는 벤치마크도 이 4개의 데이터포멧을 가지고 진행될 예정입니다.
브라우저별로 렌더링엔진, 스크립트엔진이 틀리기때문에 벤치마크에 대한 결과도 틀립니다.
그래서 제가 자주 사용하는 브라우저 3개만 벤치마크해보았습니다.

벤치마크에 사용될 브라우저와 대상 데이터포멧
 Benchmarks Browser  Internet Explorer8,Firefox 3.6.8, Chrome
 Benchmarks Data Format  HTTP, XML, JSON, AMF3

벤치마크방법:
  1. 모든 브라우저, 실행프로그램들을 꺼둔 상태(메모리, CPU할당량 최소화)
  2. 벤츠마크 사이트: http://www.jamesward.com/census/
  3. IE8->Firefox->Chrome으로 진행


벤치마크 결과:

-Internet Explorer8
Data 500Rows 보냈을때

Data 5,000Rows 보냈을때


-Firefox 3.6.8
 Data 500Rows 보냈을때

Data 5,000Rows 보냈을때


-Chrome
Data 500Rows 보냈을때

Data 5,000Rows 보냈을때


-벤치마크를 마치며
 벤치마크프로그램 시간내서 만들 생각을 하고 있었는데 마침 Server Exec Time, Transfer Time, ParseTime, RenderTime까지 나오는 친절한 벤치마크를 발견했습니다. 위 그림을 보시면 한눈에 브라우저 별로 데이터처리속도가 틀린것을 알 수 있습니다. 특히 IE8은 타브라우저보다 훨씬 느립니다.ㅎㄷㄷ.

 데이터 처리건수  500건  5,000건
 데이터 처리속도  XML>AMF3>JSON>HTML  AMF3>>XML>JSON>HTML
 데이터 크기(작은순)  AMF3>JSON>XML>HTML  AMF3>>>JSON>XML>HTML

IE8에서는 데이터크기가 커지니 XML ParseTime이 매우 늘어나 느려지는 것을 확인할 수 있습니다. 데이터 처리건수가 커질 수록 AMF3는 XML보다 월등한 처리속도를 보여줍니다(XML의 ParseTime은 처리건수에 비례). 또한 AMF3 데이터크기는 JSON의 1/10정도밖에 되질 않는 것도 확인이 되었습니다. 이러한 벤치마크결과들이 제 고민을 해결해주었습니다.

'Application Programming > Flex & Flash' 카테고리의 다른 글

Actionscript Vector 초기화(initialization)  (6) 2011.02.16
Flash AMF 의 개요  (0) 2010.03.08
Flex Builder 3에 JSON적용하기  (2) 2010.01.13
Posted by Finebe
,



Action Message Format 이라불리우는 방식을 사용하게되면 객체를 그대로 전달하고 받을수있다.

서버로부터 객체를 전달받은후에 인코딩과정을 거치게되면 완전한 형식의 데이터가 뽑혀나온다.

근데 왜 이런짓(?)을 하는가.

xml로 그냥 보내면 될것을 말이지.....

일단 xml은 보안이 되지 않는다. 사람의 눈으로 그대로 보이니 보안관련 내용부분을 암호화 인코딩 한다하여도 노출되는것은 마찮가지다.

하지만 amf방식은 프로토콜이 전용이므로 보이지 않는다. 포트는 80포트를그대로 쓰기때문에 거의 왠만한 방화벽은 통과할수있다.

그뿐아니라 데이터 량이 많을경우 이진데이터로 변환해서 전송하기에 상당한 효율을 가져온다. 이것을 이용하면 파일 전송,채팅,게임까지도

플래시에서 구현하는데 많은 잇점이 생긴다.

플래시 플레이어에 이미 이 기능이내장되어있다. 플래시 8에서는 단지 이기능을쓰기위해 별도의 컴포넌트를 받아 플래시를 업데이트 해서 써야했다.

AMF 방식은 플래시 응용프로그램과 원격 서버간의 효율적인 통신을 한다. amf는 원격 프로시져 호출을 압축된 이진 표현으로 인코딩하여 플래시 미디어서버(Flash Media Server)에서 현재 사용되고있는 프로토콜(http,rtmp) 프로토콜형식으로 변환해서 전송한다. 그형식은 액션스크립트 객체와 데이터의 값을 이진형식으로 직렬화시키기 때문에 텍스트인 xml보다 엄청난 양을 압축할수있다.

xml을 압축전송한다고생각하면된다. 이방법을 썼을때 효율적인것은 바로 트래픽관리이다.

플래시로 제대로된 게시판이나 , 기타 대중화 어플리케이션이 상용화 되지 않는이유중 하나도 xml의 양날의 검때문이다.

개인사이트가아닌 상용사이트에서 xml로 구성된 데이터를 주고받는다면 일반 html로 만드는 어플리케이션보다 수배는 더많은 트래픽과 서버의 부하를 주게된다. 그러므로 이를 해결하기위해 장비를 늘리므로해서 더 많은 비용발생이되며 이것은 운영자에게는 별로 매력적이지 않은 부분이다. amf를 사용하면 그부분을 많이 줄일수있다. amf는 플래시가 쓸수있는 최상급의 리아 기술중 하나이다.

 

amf의 규격>

amf는 amf0과 amf3가 현재 사용되고있다.

플래시 8까지와 as2.0 까지는 amf0 이 지원되고

as3.0부턴 amf3를 쓸수있다.

amf3는 플래시9와 플렉스2 부터 지원한다.

--------AMF3   에서 추가된 사항 -------

1.int , uint 객체를 정식으로 지원해서 정수로 제대로인식할수있게됨.

2.ByteArray,XML,IExternalizable 의 데이터 유형을 그대로 인식함.

3.ByteArray, NetConnection, NetStream, SharedObject, Socket 및 URLStream 클래스에는 ObjectEncoding 클래스로부터 상수가 할당되는 objectEncoding 속성이 포함되어 있는데 objectEncoding 속성의 비헤이비어는 객체에 따라 달라진다.

----------------------------------------------

flash.net.ObjectEncoding 클래스의 부모는 Object이다.

 

 

활용>

그렇다면 이걸 어떻게 어디서 누가 쓰는것일까...

지난시간강좌중  new URLStream();

부분이 있었다.

amf가 사용되는곳은 SharedObject, Socket ,NetConnection ,URLStream , IDataInput ,IExternalizable , ByteArray ,IDataOutput , NetStatusEvent ..... 상당히 많이 쓰이고있다.

var test:URLStream=new URLStream();

을 해서 생성된 인스턴스 test는 objectEncoding의 속성이 있다. 이녀석은

public function set objectEncoding(value:uint):void  의 형식으로 선언되어있고

들어가야될 value값은 flash.net.ObjectEncoding 클래스에 상수값으로 아래와같이 규정되어있다.

AMF0 : uint = 0
[static] ActionScript 1.0 및 2.0용 AMF를 사용하여 객체를 직렬화하도록 지정
AMF3 : uint = 3
[static] ActionScript 3.0용 AMF를 사용하여 객체를 직렬화하도록 지정

DEFAULT : uint = 3

[static] 현재 플레이어의 기본(최신) 형식을 지정합니다.

3일경우는 현재까지는 플래시플레이어 9이므로 amf3가 자동지정된다.

 

웁쓰 그럼 또 NetStream은 어따쓰는거지? 지난번에 파일 읽어낼때 한번 본적이 있으나 구체적으로 살펴보면 아래와같다.

 

NetStream 클래스는 NetConnection 객체에 의해 설정된 연결을 통해 Adobe의 Macromedia Flash Media Server 2 (현재 3 까지 나왔음)또는 Adobe Flex 등의 서버와 Flash Player 사이, 또는 로컬 파일 시스템과 Flash Player 사이에 단방향 스트리밍 연결을 연다.

양방향이 아닌 단방향스트리밍이다.  이녀석의 속성과 메서드들은 플래시미디어서버,플렉스 서버등에 사용되도록 만들어져있다.

위에서  AMF가 이들용으로 http,rtmp 프로토콜을 사용해서 데이터를 주고받는다고언급했을때 이 netstream클래스가 해당 프로토콜을 제어하는것으로 마찬가지로 amf도 해당된다.

 

또한가지 살펴볼 녀석은 NetConnection이다. 이녀석은 주로 NetStream과 함께쓰이는데 서버에 존재하는 명령을 실행할때쓴다.

이객체를 만든다음 connect()메소드를 실행하게되면 서버와 연결되고 call()명령으로 서버의 펑션을 직접 실행하게된다.

그결과값도 받아올수있다. 이런역할을 하기위해서는 플래시미디어서버가 있어야했다.

플래시 미디어 서버의 가격을 알아봤다면 미디어를 컨트롤하지 않고 그장점을 사용하기위해 그 가격이 너무 비싸다고 생각했을것이다.(재벌 3세는 제외)

하지만 그것을위해 php에서 amf 프로토콜을 지원하는 프로젝트가 오래전부터 있어왔다.

바로 amfphp 이다.

 

비디오만 없지 채팅,데이터등은 아주 충실히 작동해준다.

만일 비디오스트리밍까지도 지원했다면 (red5 가 현재 오픈소스이다) 값싼 php에서 소형 미디어써버들이 대량생산되었을것이다.

항상 느끼는거지만 오픈소스의 더딤은 어쩔수없다. 실험정신에 신기술은 더 빠르지만 안정성과 업데이트는 상용에 밀릴수밖에 없다.

국내에서 amfphp를 쓴 프로젝트는 극히드믈다.

필자는 홈노트라는 사이트에서 2007년에 만든 플래시가계부중 스케쥴부분은 이 amfphp로 구현했다.

하지만 얼마나 더 속도가 빠른지에 대한 장점의 정밀한 테스트는 해보지 못했다.

그리고 그럴정도로 데이터량이 많은 서버에서 과연 php를 쓸것인가 하는점도 의문이다.

하지만 우리 플래시 오타쿠들은 실험정신에 입각하여 한번쯤은 해보는것도 좋을것이다.


출처: http://cafe.naver.com/amfphpsamo.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=175

Posted by Finebe
,



인터페이스는 다중상속을 구현하기 위한 꼼수 입니다.
그렇다면 다중상속이 필요한 이유가 무엇이냐?

예를 들자면 이렇습니다.
한 회사의 부서들을 클래스로 나타내고 각 직원들을 각각의 부서에 할당했다고 하죠.
일단
1. 영업부 class
2. 기술부 class

정도로 크게 나눴다고 하고 영업부를 더 자세하게 나눈다고 치죠.

1-1 해외영업부class
1-2 국내영업부class

그리고 기술부 역시

2-1 시스템개발부 class
2-2 소프트웨어개발부 class

정도로 나눴다고 치고 모든 직원을 아래의 4개의 클래스에 속한다고 칩시다..(사실 클래스의 개념에 좀 안맞기는 하지만 예를 들기 위해서..^^;;;)
그런데 문제가 생겼습니다... 영업부 직원 중에 운전을 할줄 아는 사람과 할줄 모르는 사람이 있어서 이것을 구분해야 하는 거죠... 그렇다면 어떻게 해야 할까요....

이때 인터페이스라는 개념이 필요한 것입니다.

운전을 하고 못하고는 위의 네개의 클래스 구분과는 무관하겠죠. 다시 말하면 국내영업부 직원이나 소프트웨어개발부 직원이나 모두 운전을 할 수 있습니다.
이것은 다시 말하면 전혀 다른 방식으로 전 직원들을 구분할 필요가 있다는 것을 나타냅니다. 하지만 자바에서는 다중 상속이 불가능하죠. 왜 다중상속이 안되느냐 하면 만일 한 클래스가 두개의 클래스를 상속받을 경우에 그 클래스를 정의하는 두개의 방식이 존재해서 혼란이 일어납니다. 간단하게 이놈이 김씨 아들인지 박씨 아들인지 알수가 없어진다는 정도로 이해하면 되겠습니다. ^^;;

여기서 Drivable 이라는 인터페이스를 구현하고 운전을 할줄 아는 직원들에 대해서 이 인터페이스를 implements 하도록 하면 직책에 따른 직원의 구분 이외에 운전 여부에 대해서 다시 직원들을 구분할 수가 있을 겁니다.

어떤 직원이
extends 시스템개발부class implements Drivable
가 되었다면 이 직원은 시스템개발부에 속하면서 운전을 할줄 아는 직원이 되는 거죠.

여기에 부가적으로 일어를 할 수 있는 직원과 영어를 할 수 있는 직원 그리고 중국어를 할 수 있는 직원을 더 구분하고 싶다면 JPSpeakable, ENGSpeakable, CHNSpeakable 이라는 인터페이스를 정의하고 각각의 직원이 구사할 수 있는 외국어에 대해서 위의 인터페이스를 implements 해주면 될겁니다.


그러면 일괄적으로 일본어를 할 수 있는 직원을 부서에 관계없이 참조할 수 있겠죠.

중요한 것은 여기서 직원들에 대한 구분을 해당 부서가 가장 중요한 분류 기준이고 부가적으로 운전을 할 수 있는지로 다르게 분류하고 있다는 겁니다.
운전을 할 수 있는지가 더 중요한 기준이 된다면
Drivable 을 implements 하지 않고 extends 해서 처리하겠죠.. extends와 implements는 이런 차이입니다.

ps. 개인적으로 구현이든 상속이든 별 차이 없다고 생각합니다. 언어 차원에서 깊게 파고 들어가면 그 차이가 보이겠지만 프로그래밍을 하는 입장에서는 문법의 문제라기보다는 개념의 문제인것 같습니다.

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=65288998

'Application Programming > Java' 카테고리의 다른 글

입력된 문자열 뒤에 공백 추가해주는거  (0) 2008.11.10
Posted by Finebe
,




1. Information

typedef struct tagBITMAPFILEHEADER {
  WORD    bfType;
  DWORD   bfSize;
  WORD    bfReserved1;
  WORD    bfReserved2;
  DWORD   bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize;
  LONG   biWidth;
  LONG   biHeight;
  WORD   biPlanes;
  WORD   biBitCount;
  DWORD  biCompression;
  DWORD  biSizeImage;
  LONG   biXPelsPerMeter;
  LONG   biYPelsPerMeter;
  DWORD  biClrUsed;
  DWORD  biClrImportant;
} BITMAPINFOHEADER;

WIN32 API에서는 bitmap header부분을
파일정보와 비트맵정보로 구분해서 사용한다.

개인적으로 윈도우에서 작업을 하게 된다면 이 구조를 사용하지만
그렇지 않을 경우는 이 두부분을 한 구조체로 묶어서 사용한다.

Offset Hexa Size Name Contents
0 0x00 2 bfType Specifies the file type. It must be BM
2 0x02 4 bfSize Specifies the size, in bytes, of the bitmap file .
6 0x06 2 bfReserved1 Reserved; set to zero
8 0x08 2 bfReserved2 Reserved; set to zero
10 0x0A 4 bfOffBits Specifies the offset, in bytes, from the BITMAPFILEHEADER structure to the bitmap bits
14 0x0E 4 biSize Specifies the number of bytes required by the structure.
18 0x12 4 biWidth Specifies the width of the bitmap, in pixels.
22 0x16 4 biHeight specifies the height of the image, in pixels.If biHeight is positive, the bitmap is a bottom-up DIB and its origin is the lower-left corner. If biHeight is negative, the bitmap is a top-down DIB and its origin is the upper-left corner.If biHeight is negative, indicating a top-down DIB, biCompression must be either BI_RGB or BI_BITFIELDS. Top-down DIBs cannot be compressed. 
26 0x1A 2 biPlanes Specifies the number of planes for the target device. This value must be set to 1.
28 0x1C 2 biBitCount Specifies the number of bits per pixel. The biBitCount member of the BITMAPINFOHEADER structure determines the number of bits that define each pixel and the maximum number of colors in the bitmap. This member must be one of the following values.
30 0x1E 4 biCompression Specifies the type of compression for a compressed bottom-up bitmap (top-down DIBs cannot be compressed). This member can be the one of the following values:
34 0x22 4 biSizeImage Specifies the size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps.
38 0x26 4 biXPelsPerMeter Specifies the horizontal resolution, in pixels per meter, of the target device for the bitmap. An application can use this value to select a bitmap from a resource group that best matches the characteristics of the current device.
42 0x2A 4 biYPelsPerMeter Specifies the vertical resolution, in pixels per meter, of the target device for the bitmap
46 0x2E 4 biClrUsed Specifies the number of color indexes in the color table that are actually used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression. If biClrUsed is nonzero and the biBitCount member is less than 16, the biClrUsed member specifies the actual number of colors the graphics engine or device driver accesses. If biBitCount is 16 or greater, the biClrUsed member specifies the size of the color table used to optimize performance of the system color palettes. If biBitCount equals 16 or 32, the optimal color palette starts immediately following the three DWORD masks.
50 0x32 4 biClrImportant Specifies the number of color indexes required for displaying the bitmap. If this value is zero, all colors are required.


bfType 2byte
bitmap file 식별자
반드시 "BM" 이여야 한다. 위의 구조체 타입으로 읽을 경우는 0x4D42(19778)이다.
(실제 파일상의 값은 0x42('B') 0x4D('M')  byte_order가 small-endian 방식이다. Mac이나 Motorola처럼 big-endian에서는 다르게 표현 될려나? 확인 안해봐서 모르겠다. 이후 이 부분은 언급하지 않는다)

bfSize 4byte
file 전체의 크기를 나타낸다. ls나 dir혹은 탐색기의 등록정보를 이용하여 확인해 보면 동일하다.

bfReserved1 2byte
bfReserved2 2byte
그냥 예약 부분이다. 둘다 0으로 채워져야 한다.
굳이 예약부분을 2byte씩 둘로 나눈 이유가 무엇일까?

bfOffBits 4byte
BITMAPFILEHEADER 구조체로 부터 오프셋이란다.
괜히 MSDN 긁었나부다. 그냥 image data의 시작위치다.

biSize 4byte
구조체의 크기라고 써있다.
biSize부터 bitmap information에 대한 마지막 부분까지의 크기다.
WIN32 API에선 sizeof(BITMAPINFOHEADER)의 크기로 봐도 무방하다.
- 각각 자료형의 크기가 4byte라서(중간에 2byte는 2개) structure packed를 걱정할 필요는 없다.

biWidth 4byte
bitmap의 가로 pixel 크기이다.

biHeight 4byte
bitmap의 세로 pixel 크기이다.
양수/음수에 따라 bottom-up/top-down으로 나뉜다고 되어 있다.
뭐 일단 양수라고(bottom-up) 생각하고 넘어간다. 이 문제에 대해서 뒤에 이야기 한다.

biPlanes 2byte
해당 device에 대한 숫자라고 되어있다. 반드시 1이어야 한다
별로 의미가 없는 부분이다.

biBitCount 2byte
한 픽셀당 차지하는 비트수이다. 여기를 보면 이 비트맵이 몇 color인지(몇 bit인지) 알수 있다.
2에 대한 지수로 보면 간단하다.
1 - 2  color
4 - 16 color
8 - 256color
.
.
.

biCompression 4byte
압축 타입이라고 되어 있다.(top-down DIB에서는 사용 할 수 없다)
일반적으로 보통 0이지만 압축된 BMP의 경우에는 값이 세팅되어 있다.
wingdi.h 파일에서는 다음과 같이 선언되어 있다.
#define BI_RGB 0L
#define BI_REL8 1L
#define BI_RLE4 2L
pixel당 8bit 혹은 4bit로 Run_length 압축 됨

biSizeImage 4byte
압축되지 않은 이미지의 실제 크기이며 일반적으로 보통 0.
biSizeImage= biWidth * biHeight * 픽셀당_바이트수(256 color:1 byte, 24bit color:3 byte) 이지만
윈도우에서는 몇가지 이유로 4byte정렬을 하기 때문에 약간 보정을 해줘야 된다.
즉, biWidth가 4로 맞아 떨어지지 않는 경우에는 보정한다 - if (biWidth%4 != 0) ...
biHeight *  (biWidth + biWidth%4) * 픽셀당_바이트수

biXPelsPerMeter 4byte
biYPelsPerMeter 4byte
출력 디바이스의 수평, 수직 해상도

biClrUsed 4byte
사용한 color

biClrImportant 4byte
중요한 color





2. Palette
biBitCount 값이 1 ~ 8 까지의 값일 경우에만 사용된다.
즉 8보다 큰 값이면 palette정보는 없다.
사용되는 색상이 2 ~ 256 color이면 색상을 사용하기 위해 색상 정보를 미리 정해 놓고
image data영역에서는 색상정보의 인덱스를(해당 color를 0부터 오름차순으로 번호를 매겨서) 이용하여
색상을 표시한다.




palette 크기는 bfOffBits에서 bitmap_information부분을 빼줘도 되지만
쉽게 생각해서 4 byte(RGB값과 dummy 1byte) * 색상갯수로 계산해도 된다.

1bit(2 color) 이미지라고 해서 꼭 흑백으로 표현되지는 않는다. palette 정보를 적,청 색으로 변경하면
얼마든지 다른색으로 표현할 수 도 있다.

여담으로 모든 이미지를 256 color로 작업할 경우
작은 이미지를(16*16정도나 그 보다 작을 경우) 표현하다 보면
실제 image data영역보다 header와 palette영역이 훨씬 큰 - 배보다 배꼽이 큰 경우도 발생한다.




3. Image data
말 그대로 image data영역이다.
biBitCount 값이 1 ~ 8일 경우에는 palette 색상의 index값을 가지며
해당 bit가 한 pixel을 나타낸다(8이면 2^8 즉, 1byte로 계산하며 그 이하는 비트로)
그 이상 color를 이용하면 image_data 영역에 직접 색상 정보를 기록한다.

그리고 한가지 주의 할 점이 보통의 경우 실제 이미지와 image_data 영역의 정보는 아래위가 바뀌어 있다.
실제 이미지가 △ 이런식으로 나타날 경우에는
image_data영역에는 ▽ 식으로 기록된다.
즉, 이미지의 하단 영역부터 한 라인식(pixel기준) 기록된다.




또 여담인데 실제로 많은 사람들이 다룰수 있는 포토샵으로 이미지 작업을 하다보면
가끔씩 실제 이미지가 △, image_data영역 △ 이런식으로 기록되는 경우가 많다.(요즘 버전은 안그럴려나?)
여지껏 디자이너와 작업을 할때 게임쪽 인력보다는 대부분 웹디자이너와 작업이였는데
역시 그들이 포토샵으로 이미지를 넘겨줘서 확인해 보고 뒤집힌 이미지가 나오면 그냥 그림판으로 다시 저장을 한번더 해주는...
이거 확인하는게 있었는데 어떤 필드 값인지 잘 기억이 안난다 - 나중에 기억나면 수정 할련다.




그리고 마지막으로 여담인데
그동안 주 타겟 os가 윈도우가 아니었던 관계로
윈도우 헤더파일 안 가져다 쓰고 bitmap 헤더 구조체를 작성해서 사용하여
파일에서 해당 크기 만큼 읽어 오다보면
꼭 2 byte씩 밀린다.
위에 윈도우 구조체 보면 맨 처음 식별자가 2byte이고 그 다음 부터는 잘도 4byte로 맞추어 놓음을 볼수 있다.
맨 처음 bitmap 작업 할때 structure_align을 안 겪어 봐서(그 전까지는 개념만 있었을 뿐...)

'Application Programming' 카테고리의 다른 글

쓰레드의 종류  (0) 2014.11.25
Bitmap 구조 1  (0) 2010.01.18
Posted by Finebe
,




비트맵 구조는 의외로 단순하다.
일단 비트맵에 대한 크기등의 정보와 실제 데이터로 나뉜다. (하긴 다른 파일들도 정보와 데이터로 나뉘겠지만)

다 알고 있는데로 비트맵은 이미지의 하나하나의 픽셀에 대한 색깔 정보를 가지고 있는 구조다.
그래서 다른 이미지 포맷에(jpeg, gif등) 비해 상당히 파일크기가 큰 편이다.

1. information
비트맵 식별자, 가로/세로 사이즈, 파일크기, 사용할 색상수, 데이터 시작위치등이 포함되어 있다.
주의할 점은 사용할 색상수(흔히들 말하는 흑백, 16 color, 256 color등)를 표현하는 것으로
2의 지수형태중 지수만 표현하고 있다.
ex) 16color = 2^4,  256color = 2^8

2. palette
사용할 색상을 하나씩 지정한다.
16color 라면 16가지 색깔을 하나의 색상당 RGB형태로 4byte표기한다
(Red:0~255, Green:0~255, Blue:0~255, dummy 1byte-대부분 0값이다)
결국 4byte * 16(16가지 색상) 만큼의 크기를 차지한다.
RGB값만 표현하면 3byte면 되지만 굳이 dummy 1byte를 붙인 이유는 컴퓨터의 자료표현에 대한
속성때문이다.
2의 배수로 올라가는 2^32bit(4byte)형태라면 쉽게 접근이 가능하지만
2^24bit 형태라면 위의 경우보다 메모리 접근시 연산이 더 필요하다
- 자세한 설명은 뒤로 미루겠다.(안 할지도 모른다) System programming 영역이니까.

이 palette부분은 256 color까지만 존재한다.
그 이상의 색상을 표현할땐 palette부분이 없다.

3. image data
1bit(2color) ~ 8bit(256color) 구조 까지는 palette에 대한 index만 가지고 있다.
이 인덱스는 0~255까지가 범위이다.
이 이상 벗어나게되면(색상이 더욱 많아지면) 1byte 만으로는 표현할수가 없어서
palette에 대한 index대신 직접색상 정보를 data부분에 직접기록한다.
출처: http://www.munhi.com/cgi-bin/zboard/view.php?id=sw_development&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=9

'Application Programming' 카테고리의 다른 글

쓰레드의 종류  (0) 2014.11.25
Bitmap 구조 2  (0) 2010.01.18
Posted by Finebe
,


1. JSON 다운로드 및 설정

  • http://code.google.com/p/as3corelib/ 구글에서 제공하는 ActionScript 3 라이브러리, 소스가 있으며 다운로드도 가능하다.다운로드 경로: http://as3corelib.googlecode.com/files/as3corelib-.92.1.zip
  • 다운로드 받은 압축 파일 중에서 "as3corelib.swc" 파일을 Builder 설치폴더에 라이브러리폴더를 생성하여 복사한다.
  • Flex Builder 3에서
    1. 메뉴에서 Window > Open Perspective > Flex Development
    2. 다시 메뉴에서 Window > Show View > Navigator
    3. 사용하고자 하는 프로젝트를 선택 후에 마우스 오른쪽 버튼을 클릭 후 "Properties" 선택한다.
    4. Flex Build Path > Library Path 을 선택 후에 아래 그림과 같이 as3corelib.swc 파일을 추가한다.


       

2. 테스트 소스
 http://rrao.host.adobe.com/kannan/JSONTest.mxml




Posted by Finebe
,



후렌드가 줌.

class Test2
{
 public static void main(String[] args)
 {
  Test2 t = new Test2();
  String input = "가나다라마바사";
  int length = input.getBytes().length;      

  System.out.println("처리전: " + input +"끝");
  System.out.println("처리후 : " + t.appendSpace(input, length*2)+"끝");

 }


public String appendSpace(String str, int len) {
  int strLength = str.getBytes().length;
  String tempStr = str;
 
  if (strLength <len) {
   int endCount = len - strLength;

   for (int i=0 ; i<endCount ; i++) {
    str = str + " ";
   }
  } else if (strLength > len) {
   byte[] temp = new byte[len];
   System.arraycopy (str.getBytes(), 0, temp, 0, len);
   str = new String (temp);
  } else {
  
  }
 
  // 한글을 못짜를때.... len 에 한글이 물려 있을경우...
  // 이경우는 len-1 만큼 자른후 공백을 붙여 반환한다.
  if (str.length() == 0) {
   byte[] temp = new byte[len];
   System.arraycopy (tempStr.getBytes(), 0, temp, 0, len-1);
   str = new String (temp);
  }
 
  return str;
 }

'Application Programming > Java' 카테고리의 다른 글

인터페이스(interface)  (0) 2010.01.21
Posted by Finebe
,