본문 바로가기

Java

bin file to png file

728x90

bin file to png file



이진 파일(.bin)을 이미지 파일(.jpg or .png)로 변환하는 과제를 하게 되었다.

이 과제를 하면서 알게 된 내용을 정리하고자 한다.

 

❓ header 정보 읽어오기

import java.io.*;
import java.util.zip.*;

// zip 파일 압출 해제해 .bin파일 정보 읽기
DataInputStream dis = new DataInputStream(zipIn);

// Read Header (4 bytes)
int Header = Integer.reverseBytes(dis.readInt());

header 정보에 이미지 길이 정보가 들어있어 그 값을 읽어 그 정보를 이용해야 했다.

 

 

❓ 1 pixel은 몇 바이트일까?

일반적으로, Red, Green, Blue (RGB) 색상 채널을 나타내는 3바이트
만약, Alpha 채널이 있다면 4바이트

 

❓ 그렇다면, Alpha 채널은 뭘까?

투명도를 의미

 

총 4바이트면, 1바이트 A, 1바이트 R, 1바이트 G, 1바이트 B 정보를 담고 있어야 한다.

 

예를 들어보자.

int pixelValue = Integer.reverseBytes(dis.readInt()); // 996byte를 4byte씩 읽어
int rgbValue = (0xFF << 24) | (pixelValue << 16) | (pixelValue << 8) | pixelValue; // ARGB 형식으로 변환

 

❓ (0xFF << 24)

16진수 15×16 +15×1 = 255 

이를 이진수로 나타내면 11111111 로 불투명함을 의미한다.

24비트 앞땅기므로 

11111111 00000000 00000000 00000000

 

❓ (pixelValue << 16)

16진수 값으로  RED 채널 값이 들어있을 것이다.

만약 Alpha값과 마찬가지로 0xFF이라면,

00000000 11111111 00000000 00000000

 

최종적으로 OR 연산자를 이용해 ARGB값을 의미하는 rgbValue값을 구할 수 있을 것이다.

11111111(A) 11111111(R) 10101111(G) 00001100(B)

이 정보를 이용해 pixcel을 찍어 .png나 .jpg의 이미지 파일로 변환할 수 있었다.

 

직접 구현해보니, pixel에 대해 자세히 알게 되었고 신기했다!