라즈베리파이를이용하여 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 |