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

質問編集履歴

2

誤字の修正

2015/05/07 10:09

投稿

takotakot
takotakot

スコア1111

title CHANGED
File without changes
body CHANGED
@@ -75,9 +75,9 @@
75
75
  nb = b;
76
76
  } else if (min_rgb == max_val) {
77
77
  na = 0;
78
- nr = 128;
78
+ nr = max_val;
79
- ng = 128;
79
+ ng = max_val;
80
- nb = 128;
80
+ nb = max_val;
81
81
  } else {
82
82
  na = max_val - min_rgb;
83
83
  nr = (r + na - max_val) * max_val / na;

1

参考プログラム例示

2015/05/07 10:09

投稿

takotakot
takotakot

スコア1111

title CHANGED
File without changes
body CHANGED
@@ -12,4 +12,84 @@
12
12
  [透明度を計算してみよう / 黒と白の上にアルファ合成された色からの元の色と不透明度の計算ツール](http://gratinking.blog.fc2.com/blog-entry-17.html)
13
13
  のようなこと(後者は少し違いますが)が行えればよいと思っています。ただ、印字された時の色は、できるだけ保ちたいです。
14
14
 
15
- よろしくお願い致します。
15
+ よろしくお願い致します。
16
+
17
+ まず png ファイルを ppm ファイルにしておき、以下のようなプログラムで、ppm ファイルから 色情報の ppm と、アルファチャンネルの pgm を生成、最後に、それらを結合して透過 png を生成…としてみることはできました。
18
+ もっといい方法があれば、教えて下さい。
19
+ ```lang-bash
20
+ filename="a.png"
21
+ base=`basename $filename .png`
22
+ pngtopam $filename | pamtopnm -plain > ${base}.ppm
23
+ ./pnmalpha ${base}.ppm ${base}_col.ppm ${base}_alpha.pgm
24
+ pnmtopng -force -alpha=${base}_alpha.pgm ${base}_col.ppm > ${base}_trans.png
25
+ ```
26
+ ```lang-C++
27
+ #include<iostream>
28
+ #include<fstream>
29
+ #include<algorithm>
30
+
31
+ int main(int argc, char **argv) {
32
+ if (argc < 4) {
33
+ std::cout << "too few arguments" << std::endl;
34
+ std::cout << "usage: src.ppm dst.ppm alpha.pgm" << std::endl;
35
+ return 1;
36
+ }
37
+
38
+ const std::string magic_ppm = "P3", magic_pgm = "P2";
39
+ std::string magic;
40
+ std::ifstream ifs(argv[1]);
41
+ std::ofstream ofs_color(argv[2]), ofs_alpha(argv[3]);
42
+ int w, h, max_val;
43
+ int r, g, b, min_rgb; // current val
44
+ int nr, ng, nb, na; // new val
45
+
46
+ if (!ifs || !ofs_color || !ofs_alpha) {
47
+ std::cerr << "file open error" << std::endl;
48
+ return 1;
49
+ }
50
+
51
+ ifs >> magic;
52
+ if (magic != magic_ppm) {
53
+ std::cerr << "input file format error" << std::endl;
54
+ return 1;
55
+ }
56
+ ifs >> w >> h;
57
+ ifs >> max_val;
58
+
59
+ ofs_color << magic_ppm << std::endl;
60
+ ofs_color << w << " " << h << std::endl;
61
+ ofs_color << max_val << std::endl;
62
+
63
+ ofs_alpha << magic_pgm << std::endl;
64
+ ofs_alpha << w << " " << h << std::endl;
65
+ ofs_alpha << max_val << std::endl;
66
+
67
+ for (int i = 0; i < h; ++i) {
68
+ for (int j = 0; j < w; ++j) {
69
+ ifs >> r >> g >> b;
70
+ min_rgb = std::min(r, std::min(g, b));
71
+ if (min_rgb == 0) {
72
+ na = max_val;
73
+ nr = r;
74
+ ng = g;
75
+ nb = b;
76
+ } else if (min_rgb == max_val) {
77
+ na = 0;
78
+ nr = 128;
79
+ ng = 128;
80
+ nb = 128;
81
+ } else {
82
+ na = max_val - min_rgb;
83
+ nr = (r + na - max_val) * max_val / na;
84
+ ng = (g + na - max_val) * max_val / na;
85
+ nb = (b + na - max_val) * max_val / na;
86
+ }
87
+ ofs_color << nr << " " << ng << " " << nb << " ";
88
+ ofs_alpha << na << " ";
89
+ }
90
+ ofs_color << std::endl;
91
+ ofs_alpha << std::endl;
92
+ }
93
+ return 0;
94
+ }
95
+ ```