본문 바로가기
C#/C# 문법

C# Image To PPM

by TcTT 2018. 10. 10.
반응형

라즈베리파이를이용하여 LedMatrix를 구현할때 사용했던 내용이다.


전체적인 로직은 

1. PC(Window10)에서 이미지생성

2. 생성된 이미지 SFTP로 라즈베리파이 전송

3. SSH를 사용하여 라즈베리파이 명령어 전송

하는 방식으로 구현했다.


LedMatrix의 오픈소스가 jpg, png, bmp 등 이미지파일을 인식하지못하고,

나중에 ReadMe파일을 읽어보니 jpg, png등 다양한 이미지도 허용할 수 있도록 하는 방법이 있었다.



아무튼 처음에 ppm 확장자만 인식 가능해서 C#을 통해 Bitmap을 PPM으로 컨버팅하는 소스를 만들었다.


그전에 PPM(Portable PixMap)에 간략히 설명하면,

헤더는 크게 3가지를 포함한다

1. Identifier(식별자) P1 ~ P6을 사용한다.

P1~P3은 ASCII 파일이고

P4~P6은 BINARY 파일이다.


숫자별 파일 형식은 아래와 같다.

P1, P4: PBM

P2, P5: PGM

P3, P6: PPM


2. Width, Height

말그대로 사용할 PPM이미지의 크기..


3. Maxium Value

사용할 값의 최대치이다. 만약 (255, 255, 255)흰색을 구현하려면 255를 적어줘야함



PPM HEADER의 예시이다.

( #으로시작해서 \n(개행)을 만나기전까지 전부 주석처리로 간주됨 )

P6                    (형식)

1024 788           (사이즈)

# A comment     (주석)

255                  (사용 맥스값)



PPM 파일 전체 내용이다.

P6

# example from the man page

4 4

255

 0  0  0    0  0  0    0  0  0   15  0 15

 0  0  0    0 15  7    0  0  0    0  0  0

 0  0  0    0  0  0    0 15  7    0  0  0

15  0 15    0  0  0    0  0  0    0  0  0


C#에서 Bitmap을 PPM으로 컨버팅하는 소스는 아래와같다.

함수로 묶어 사용하면 될거같다.

소스는 주석을 친절히 적어서 사용하는데 문제 없을거같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//ppm파일 저장위치..
string file = Application.StartupPath + "\\" + "test.ppm";
 
//이미지 불러오기
Bitmap tempBitmap = new Bitmap(@"이미지.bmp");
 
//Bitmap To PPM 변환시 File 헤더내용 추가
StreamWriter writer = new StreamWriter(file);
//P6은 PPM확장자중 바이너리 사용을 뜻함
//헤더파일 내용 끝엔 \n으로 적어줘야함.
writer.Write("P6" + "\n");
//헤더부분에 이미지사이즈를 작성해주지않으면 라즈베리에서 인식이 불가능하여 File 사이즈 내용 추가
writer.Write(TempBitmap.Width + " " + TempBitmap.Height + "\n");
//255 RGB를 사용하는 헤더 추가
writer.Write("255" + "\n");
writer.Close();
//파일 헤더내용 종료
 
//파일 데이터 추가 입력
BinaryWriter writerB = new BinaryWriter(new FileStream(file, FileMode.Append));
for (int x = 0; x < tempBitmap.Height; x++)
{
    for (int y = 0; y < tempBitmap.Width; y++)
    {
        Color color = ResizeBitmap.GetPixel(y, x);
        writerB.Write(color.R);
        writerB.Write(color.G);
        writerB.Write(color.B);
    }
}
writerB.Close();
cs


반응형

'C# > C# 문법' 카테고리의 다른 글

C# Dictionary HashTable List HashSet  (0) 2018.12.21
C# MessageBox  (0) 2018.09.17
C# Split  (0) 2018.08.20