teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード修正

2019/05/02 08:34

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -1,29 +1,34 @@
1
1
  [8bitカラーのBMP画像のカラーパレット操作(python PIL)。](http://d.hatena.ne.jp/redtaxi/20090526/1243330783)の手法でできそうです。
2
2
  コードにすると以下のような感じになるでしょうか。
3
3
  ```Python
4
+
4
5
  from PIL import Image
5
6
  import matplotlib.pyplot as plt
6
7
  import numpy as np
7
8
 
8
- img = Image.open(r"test.bmp")
9
+ img = Image.open(r"lena.png") # http://optipng.sourceforge.net/pngtech/img/lena.html
9
10
  #インデックスカラーに変換
10
11
  img = img.convert("P")
11
12
 
12
13
  # カラーパレットにアクセスする。
13
14
  palette = img.getpalette()
14
15
 
16
+ # リストの値は index=0 から順番に [R, G, B, R, G, B, ...]
17
+ palette = np.array(palette).reshape(-1, 3)
18
+
15
19
  # 入れ替え
16
20
  tmp = palette[2]
17
21
  palette[2] = palette[15]
18
22
  palette[15] = tmp
19
23
 
20
24
  # パレット数の変更
21
- N_COLOR = len(palette) - 100 # 適当な数に減らす
25
+ N_COLOR = len(palette)-100 # 適当な数に減らす
22
26
  palette = palette[:N_COLOR]
23
27
 
28
+ # パレットの更新
29
+ palette = palette.reshape(-1).tolist()
24
30
  img.putpalette(palette)
25
31
 
26
-
27
32
  # 実データの更新
28
33
  data = list(img.getdata())
29
34
  # この処理はやりたいことに従ってご自身で実装ください。
@@ -32,5 +37,6 @@
32
37
  data[i] = N_COLOR-1 # とりあえず末尾の番号に振る?
33
38
 
34
39
  img.putdata(data)
35
- img.save('ret.bmp')
40
+ img.save('ret.png')
36
- ```
41
+ ```
42
+ ![イメージ説明](28b34d5ee07fc86d59baffaa02689549.png)