<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
		<id>http://lhdangerous.godohosting.com/wiki/index.php?action=history&amp;feed=atom&amp;title=POV_%28%EC%9E%94%EC%83%81%ED%9A%A8%EA%B3%BC%29_display%EC%9A%A9_pixel_data_%EB%A7%8C%EB%93%A4%EA%B8%B0</id>
		<title>POV (잔상효과) display용 pixel data 만들기 - 편집 역사</title>
		<link rel="self" type="application/atom+xml" href="http://lhdangerous.godohosting.com/wiki/index.php?action=history&amp;feed=atom&amp;title=POV_%28%EC%9E%94%EC%83%81%ED%9A%A8%EA%B3%BC%29_display%EC%9A%A9_pixel_data_%EB%A7%8C%EB%93%A4%EA%B8%B0"/>
		<link rel="alternate" type="text/html" href="http://lhdangerous.godohosting.com/wiki/index.php?title=POV_(%EC%9E%94%EC%83%81%ED%9A%A8%EA%B3%BC)_display%EC%9A%A9_pixel_data_%EB%A7%8C%EB%93%A4%EA%B8%B0&amp;action=history"/>
		<updated>2026-04-18T09:05:11Z</updated>
		<subtitle>이 문서의 편집 역사</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>http://lhdangerous.godohosting.com/wiki/index.php?title=POV_(%EC%9E%94%EC%83%81%ED%9A%A8%EA%B3%BC)_display%EC%9A%A9_pixel_data_%EB%A7%8C%EB%93%A4%EA%B8%B0&amp;diff=248&amp;oldid=prev</id>
		<title>Doguin: 새 문서: # POV (잔상효과)용 pixel data (픽셀 데이타) 만들기  ## 이미지 구하기 일단 pov 디스플레이에 표시할 이미지를 만들거나 구한다. ## rescale &amp; GIF c...</title>
		<link rel="alternate" type="text/html" href="http://lhdangerous.godohosting.com/wiki/index.php?title=POV_(%EC%9E%94%EC%83%81%ED%9A%A8%EA%B3%BC)_display%EC%9A%A9_pixel_data_%EB%A7%8C%EB%93%A4%EA%B8%B0&amp;diff=248&amp;oldid=prev"/>
				<updated>2018-09-14T07:05:56Z</updated>
		
		<summary type="html">&lt;p&gt;새 문서: # POV (잔상효과)용 pixel data (픽셀 데이타) 만들기  ## 이미지 구하기 일단 pov 디스플레이에 표시할 이미지를 만들거나 구한다. ## rescale &amp;amp; GIF c...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;# POV (잔상효과)용 pixel data (픽셀 데이타) 만들기&lt;br /&gt;
&lt;br /&gt;
## 이미지 구하기&lt;br /&gt;
일단 pov 디스플레이에 표시할 이미지를 만들거나 구한다.&lt;br /&gt;
## rescale &amp;amp; GIF converting&lt;br /&gt;
표시할 POV 디스플레이의 세로 픽셀수 (led strip의 led 수)에 맞추어 스케일 조절하고 GIF로 저장한다. &lt;br /&gt;
## GIF &amp;gt; pixel data 컨버터 **convert.py**&lt;br /&gt;
adafruit의 `Kinetic POV project` github페이지에서 구할 수 있다.&lt;br /&gt;
https://github.com/adafruit/Kinetic_POV&lt;br /&gt;
convert폴더에 예제용 이미지와 함께 들어있다.&lt;br /&gt;
python 2.7용이다.&lt;br /&gt;
&lt;br /&gt;
### PIL 설치&lt;br /&gt;
python으로 만들어진 converter에서 `PIL` (python Image Library)라는 모듈을 필요로함.&lt;br /&gt;
PIL은 개발중지되었으므로 우리는 그 후속 버전인 `pilow`를 설치해 사용함.(사용방법은 동일) &lt;br /&gt;
파이썬 모듈 설치 프로그램인 `pip`를 사용한다. [참고: pip사용해 python 모둘 설치하기](https://wikidocs.net/5763)&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
$pip2 install pillow&lt;br /&gt;
```&lt;br /&gt;
![||600](https://cl.ly/2r322G0U2a1W/Image%202018-08-19%20at%207.38.16%20AM.png)&lt;br /&gt;
&lt;br /&gt;
### convert.py 실행&lt;br /&gt;
```bash&lt;br /&gt;
$python2 convert.py testImage.gif &amp;gt; testImage.h&lt;br /&gt;
```&lt;br /&gt;
여러개의 이미지를 동시에 변환할 수도 있다.&lt;br /&gt;
```bash&lt;br /&gt;
$python2 convert.py *.gif &amp;gt; testImages.h&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
![](https://cl.ly/1F2m2n1x3c0a/pride.gif)&lt;br /&gt;
&lt;br /&gt;
^원본&lt;br /&gt;
```c&lt;br /&gt;
// Don't edit this file!  It's software-generated.&lt;br /&gt;
// See convert.py script instead.&lt;br /&gt;
&lt;br /&gt;
#define PALETTE1  0&lt;br /&gt;
#define PALETTE4  1&lt;br /&gt;
#define PALETTE8  2&lt;br /&gt;
#define TRUECOLOR 3&lt;br /&gt;
&lt;br /&gt;
#define NUM_LEDS 16&lt;br /&gt;
&lt;br /&gt;
// pride.gif ---------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
const uint8_t PROGMEM palette00[][3] = {&lt;br /&gt;
  {  34,   0,  75 },&lt;br /&gt;
  {  75,  75,   0 },&lt;br /&gt;
  {   0,  50,   0 },&lt;br /&gt;
  {   0,   0,   0 },&lt;br /&gt;
  {  75,   0,   0 },&lt;br /&gt;
  {  75,  18,   0 },&lt;br /&gt;
  {   0,   6,  75 } };&lt;br /&gt;
&lt;br /&gt;
const uint8_t PROGMEM pixels00[] = {&lt;br /&gt;
  0X34, 0X44, 0X44, 0X44, 0X44, 0X44, 0X44, 0X43,&lt;br /&gt;
  0X33, 0X44, 0X44, 0X44, 0X44, 0X44, 0X44, 0X33,&lt;br /&gt;
  0X53, 0X34, 0X44, 0X44, 0X44, 0X44, 0X43, 0X35,&lt;br /&gt;
  0X55, 0X33, 0X44, 0X44, 0X44, 0X44, 0X33, 0X55,&lt;br /&gt;
  0X55, 0X53, 0X34, 0X44, 0X44, 0X43, 0X35, 0X55,&lt;br /&gt;
  0X55, 0X55, 0X33, 0X44, 0X44, 0X33, 0X55, 0X55,&lt;br /&gt;
  0X55, 0X55, 0X53, 0X34, 0X43, 0X35, 0X55, 0X55,&lt;br /&gt;
  0X55, 0X55, 0X55, 0X33, 0X33, 0X55, 0X55, 0X55,&lt;br /&gt;
  0X55, 0X55, 0X55, 0X53, 0X35, 0X55, 0X55, 0X55,&lt;br /&gt;
  0X35, 0X55, 0X55, 0X55, 0X55, 0X55, 0X55, 0X53,&lt;br /&gt;
  0X33, 0X55, 0X55, 0X55, 0X55, 0X55, 0X55, 0X33,&lt;br /&gt;
  0X13, 0X35, 0X55, 0X55, 0X55, 0X55, 0X53, 0X31,&lt;br /&gt;
  0X11, 0X33, 0X55, 0X55, 0X55, 0X55, 0X33, 0X11,&lt;br /&gt;
  0X11, 0X13, 0X35, 0X55, 0X55, 0X53, 0X31, 0X11,&lt;br /&gt;
  0X11, 0X11, 0X33, 0X55, 0X55, 0X33, 0X11, 0X11,&lt;br /&gt;
  0X11, 0X11, 0X13, 0X35, 0X53, 0X31, 0X11, 0X11,&lt;br /&gt;
  0X11, 0X11, 0X11, 0X33, 0X33, 0X11, 0X11, 0X11,&lt;br /&gt;
  0X11, 0X11, 0X11, 0X13, 0X31, 0X11, 0X11, 0X11,&lt;br /&gt;
  0X31, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X13,&lt;br /&gt;
  0X33, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X33,&lt;br /&gt;
  0X23, 0X31, 0X11, 0X11, 0X11, 0X11, 0X13, 0X32,&lt;br /&gt;
  0X22, 0X33, 0X11, 0X11, 0X11, 0X11, 0X33, 0X22,&lt;br /&gt;
  0X22, 0X23, 0X31, 0X11, 0X11, 0X13, 0X32, 0X22,&lt;br /&gt;
  0X22, 0X22, 0X33, 0X11, 0X11, 0X33, 0X22, 0X22,&lt;br /&gt;
  0X22, 0X22, 0X23, 0X31, 0X13, 0X32, 0X22, 0X22,&lt;br /&gt;
  0X22, 0X22, 0X22, 0X33, 0X33, 0X22, 0X22, 0X22,&lt;br /&gt;
  0X22, 0X22, 0X22, 0X23, 0X32, 0X22, 0X22, 0X22,&lt;br /&gt;
  0X32, 0X22, 0X22, 0X22, 0X22, 0X22, 0X22, 0X23,&lt;br /&gt;
  0X33, 0X22, 0X22, 0X22, 0X22, 0X22, 0X22, 0X33,&lt;br /&gt;
  0X63, 0X32, 0X22, 0X22, 0X22, 0X22, 0X23, 0X36,&lt;br /&gt;
  0X66, 0X33, 0X22, 0X22, 0X22, 0X22, 0X33, 0X66,&lt;br /&gt;
  0X66, 0X63, 0X32, 0X22, 0X22, 0X23, 0X36, 0X66,&lt;br /&gt;
  0X66, 0X66, 0X33, 0X22, 0X22, 0X33, 0X66, 0X66,&lt;br /&gt;
  0X66, 0X66, 0X63, 0X32, 0X23, 0X36, 0X66, 0X66,&lt;br /&gt;
  0X66, 0X66, 0X66, 0X33, 0X33, 0X66, 0X66, 0X66,&lt;br /&gt;
  0X66, 0X66, 0X66, 0X63, 0X36, 0X66, 0X66, 0X66,&lt;br /&gt;
  0X36, 0X66, 0X66, 0X66, 0X66, 0X66, 0X66, 0X63,&lt;br /&gt;
  0X33, 0X66, 0X66, 0X66, 0X66, 0X66, 0X66, 0X33,&lt;br /&gt;
  0X03, 0X36, 0X66, 0X66, 0X66, 0X66, 0X63, 0X30,&lt;br /&gt;
  0X00, 0X33, 0X66, 0X66, 0X66, 0X66, 0X33, 0X00,&lt;br /&gt;
  0X00, 0X03, 0X36, 0X66, 0X66, 0X63, 0X30, 0X00,&lt;br /&gt;
  0X00, 0X00, 0X33, 0X66, 0X66, 0X33, 0X00, 0X00,&lt;br /&gt;
  0X00, 0X00, 0X03, 0X36, 0X63, 0X30, 0X00, 0X00,&lt;br /&gt;
  0X00, 0X00, 0X00, 0X33, 0X33, 0X00, 0X00, 0X00,&lt;br /&gt;
  0X00, 0X00, 0X00, 0X03, 0X30, 0X00, 0X00, 0X00,&lt;br /&gt;
  0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03,&lt;br /&gt;
  0X33, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33,&lt;br /&gt;
  0X43, 0X30, 0X00, 0X00, 0X00, 0X00, 0X03, 0X34,&lt;br /&gt;
  0X44, 0X33, 0X00, 0X00, 0X00, 0X00, 0X33, 0X44,&lt;br /&gt;
  0X44, 0X43, 0X30, 0X00, 0X00, 0X03, 0X34, 0X44,&lt;br /&gt;
  0X44, 0X44, 0X33, 0X00, 0X00, 0X33, 0X44, 0X44,&lt;br /&gt;
  0X44, 0X44, 0X43, 0X30, 0X03, 0X34, 0X44, 0X44,&lt;br /&gt;
  0X44, 0X44, 0X44, 0X33, 0X33, 0X44, 0X44, 0X44,&lt;br /&gt;
  0X44, 0X44, 0X44, 0X43, 0X34, 0X44, 0X44, 0X44 };&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  uint8_t        type;    // PALETTE[1,4,8] or TRUECOLOR&lt;br /&gt;
  line_t         lines;   // Length of image (in scanlines)&lt;br /&gt;
  const uint8_t *palette; // -&amp;gt; PROGMEM color table (NULL if truecolor)&lt;br /&gt;
  const uint8_t *pixels;  // -&amp;gt; Pixel data in PROGMEM&lt;br /&gt;
} image;&lt;br /&gt;
&lt;br /&gt;
const image PROGMEM images[] = {&lt;br /&gt;
  { PALETTE4 ,   54, (const uint8_t *)palette00, pixels00 }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define NUM_IMAGES (sizeof(images) / sizeof(images[0]))&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
^ 변환된 데이타&lt;br /&gt;
&lt;br /&gt;
* GIF 파일형식에서는 palette라는 개념이 있는데, 이미지에서 사용된 컬러를 표로 만들어 놓은 것이다. 예를들어 이미지가 빨강 흰색 보라 3개 색만 사용하고 있다면 팔레트에는 이 3개 색이 등록된다. 이런 방법을 쓰면 각 픽셀마다 RGB값을 기억하는 대신 팔레트의 몇번째 색인지만 기록하면 되므로 저장공간을 많이 아낄 수 있다.&lt;br /&gt;
&lt;br /&gt;
팔레트기능을 사용하지 않는 GIF파일은 아무리 적은 수의 컬러를 사용하고 있어도 truecolor로 취급되어 크기가 커진다. GIF opimizer를 사용해 크기즐 줄이도록 하자.&lt;br /&gt;
[online GIF optimizer](http://gifgifs.com/optimizer/)&lt;br /&gt;
![||600](https://cl.ly/3M3C2t3M1K0h/Image%202018-08-19%20at%209.28.40%20AM.png)&lt;br /&gt;
color Reduction 옵션을 사용한다.&lt;br /&gt;
&lt;br /&gt;
* 위 예제에서 컬러팔레트는...&lt;br /&gt;
```c&lt;br /&gt;
const uint8_t PROGMEM palette00[][3] = {&lt;br /&gt;
  {  34,   0,  75 },&lt;br /&gt;
  {  75,  75,   0 },&lt;br /&gt;
  {   0,  50,   0 },&lt;br /&gt;
  {   0,   0,   0 },&lt;br /&gt;
  {  75,   0,   0 },&lt;br /&gt;
  {  75,  18,   0 },&lt;br /&gt;
  {   0,   6,  75 } };&lt;br /&gt;
```&lt;br /&gt;
이 부분이 이미지에 사용된 컬러를 나타내는 컬러팔레트다. 7개 컬러가 사용되었나보다.&lt;br /&gt;
&lt;br /&gt;
* 각 픽셀정보를 담고 있는 곳은 &lt;br /&gt;
```c&lt;br /&gt;
const uint8_t PROGMEM pixels00[] = {&lt;br /&gt;
  0X34, 0X44, 0X44, 0X44, 0X44, 0X44, 0X44, 0X43,&lt;br /&gt;
  0X33, 0X44, 0X44, 0X44, 0X44, 0X44, 0X44, 0X33,&lt;br /&gt;
  .&lt;br /&gt;
  .&lt;br /&gt;
  .&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
이 부분이다.&lt;br /&gt;
흑백 이미지는 1개byte에 8개 픽셀 데이터를,&lt;br /&gt;
16색이하 이미지는 1개 byte에 2개 팩셀 데이터를, &lt;br /&gt;
256색 이미지는 1개 byte가 1개 픽셀데이터를,&lt;br /&gt;
트루컬러 이미지는 3개 byte가 1가 픽셀데이터를 담도록 하고 있다.(저장공간 아끼기위함)&lt;br /&gt;
&lt;br /&gt;
위 변환된 예제는 1byte가 2픽셀 데이터를 담고잇으며, 각 바이트 값을 보면 0~6의 값을 갖는데, 물론 팔레트의 몇번 컬러인지를 나타내는 것이다.&lt;br /&gt;
&lt;br /&gt;
* `image`라는 struct 를 만들어 사용하고 있는데, &lt;br /&gt;
```&lt;br /&gt;
typedef struct {&lt;br /&gt;
  uint8_t        type;    // PALETTE[1,4,8] or TRUECOLOR&lt;br /&gt;
  line_t         lines;   // Length of image (in scanlines)&lt;br /&gt;
  const uint8_t *palette; // -&amp;gt; PROGMEM color table (NULL if truecolor)&lt;br /&gt;
  const uint8_t *pixels;  // -&amp;gt; Pixel data in PROGMEM&lt;br /&gt;
} image;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* 배열로 선언된 이유는 여러개 이미지를 동시에 변환하는 기능을 위해서인다. 첫번째 그림은 image[0], 두번째는 image[1]...에 담긴다.&lt;br /&gt;
```c&lt;br /&gt;
const image PROGMEM images[] = {&lt;br /&gt;
  { PALETTE4 ,   54, (const uint8_t *)palette00, pixels00 }&lt;br /&gt;
};&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
* 데이터가 모두 `PROGMEM`키워드를 사용해 선언되었는데, 이는 아두이노 코드가 실행될 때 이 데이터는 sram에 로딩하지 않고 flash 메모리에서 직접 읽도록 한다는 의미이다. 속도는 느려지겠지만 램공간을 아낄 수 있다.&lt;br /&gt;
참고: https://www.arduino.cc/reference/en/language/variables/utilities/progmem/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 참고자료&lt;br /&gt;
https://learn.adafruit.com/genesis-poi-dotstar-led-persistence-of-vision-poi?view=all#preparing-images&lt;br /&gt;
&lt;br /&gt;
[[category::Display]]&lt;/div&gt;</summary>
		<author><name>Doguin</name></author>	</entry>

	</feed>