質問編集履歴
2
誤字の修正
    
        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 =  | 
| 78 | 
            +
            				nr = max_val;
         | 
| 79 | 
            -
            				ng =  | 
| 79 | 
            +
            				ng = max_val;
         | 
| 80 | 
            -
            				nb =  | 
| 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
参考プログラム例示
    
        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 | 
            +
            ```
         | 
