質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Photoshop

    100questions

    Photoshopとは、アドビシステムズ(株)が開発した画像編集のソフトウェアです。 イラストレーターや印刷業界などで幅広く使われている他、初心者や一般向けの写真編集用に開発されたソフトもあります。 専用に開発されたフィルターやプラグインを追加すると、機能を拡張することができます。

  • ImageMagick

    92questions

    ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

  • Illustrator

    53questions

    Illustratorは、アドビシステムズ(株)が開発した描画ツールソフトです。 イラスト製作やロゴタイプ、広告作成時などのデザインツールとして、さまざまな分野のクリエーターに愛用されています。 プラグインの中にCADや3DCG機能の拡張ができるものがあります。 特に広告作成などの印刷業界では、トップクラスのシェアを誇っているソフトです。

  • Inkscape

    7questions

    Inkscape(インクスケープ)はオリジナル画像やオリジナルロゴの作成、写真の加工が出来るソフトです

  • GIMP

    6questions

    画像編集、加工ソフト

見た目の色を変えずに、画像を透過させるには?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,787

takotakot

score 1046

白色背景についての、見た目を保ったまま png を透過させたいのですが、どんな方法がありますでしょうか。
ひとまず、手法、言語、ツール等は問いません。ただ、バッチ処理ができると、嬉しいです。
以下、状況です。

スキャンした印鑑の印影画像(赤)があります。白色部(紙)を透過させることは、あまり難しくはありません。選択して、透過色に設定します。
ところが、この画像を文字等に重ねると、ある問題が生じます。
  1.  (軽微な問題) 抜ききれなかった白色部が上書きされる
  2.  印鑑で押印した場合、下の文字が見える(半透明)が、画像を重ねてしまうと、消えてしまう
どちらも、根本は同じ問題で、透過の設定が不十分であることです。
要するに、トーンカーブで紙は完全に白にしておいて、明度や輝度からアルファチャンネルを作ればよいのでしょうが、適当な方法を探すことができませんでした。
【Photoshop】写真の影を使った透過 / 明度からアルファチャンネル作成
透明度を計算してみよう / 黒と白の上にアルファ合成された色からの元の色と不透明度の計算ツール
のようなこと(後者は少し違いますが)が行えればよいと思っています。ただ、印字された時の色は、できるだけ保ちたいです。

よろしくお願い致します。

まず png ファイルを ppm ファイルにしておき、以下のようなプログラムで、ppm ファイルから 色情報の ppm と、アルファチャンネルの pgm を生成、最後に、それらを結合して透過 png を生成…としてみることはできました。
もっといい方法があれば、教えて下さい。
filename="a.png"
base=`basename $filename .png`
pngtopam $filename | pamtopnm -plain > ${base}.ppm
./pnmalpha ${base}.ppm ${base}_col.ppm ${base}_alpha.pgm
pnmtopng -force -alpha=${base}_alpha.pgm ${base}_col.ppm > ${base}_trans.png
#include<iostream>
#include<fstream>
#include<algorithm>

int main(int argc, char **argv) {
    if (argc < 4) {
        std::cout << "too few arguments" << std::endl;
        std::cout << "usage: src.ppm dst.ppm alpha.pgm" << std::endl;
        return 1;
    }

    const std::string magic_ppm = "P3", magic_pgm = "P2";
    std::string magic;
    std::ifstream ifs(argv[1]);
    std::ofstream ofs_color(argv[2]), ofs_alpha(argv[3]);
    int w, h, max_val;
    int r, g, b, min_rgb;  // current val
    int nr, ng, nb, na;  // new val

    if (!ifs || !ofs_color || !ofs_alpha) {
        std::cerr << "file open error" << std::endl;
        return 1;
    }

    ifs >> magic;
    if (magic != magic_ppm) {
        std::cerr << "input file format error" << std::endl;
        return 1;
    }
    ifs >> w >> h;
    ifs >> max_val;

    ofs_color << magic_ppm << std::endl;
    ofs_color << w << " " << h << std::endl;
    ofs_color << max_val << std::endl;

    ofs_alpha << magic_pgm << std::endl;
    ofs_alpha << w << " " << h << std::endl;
    ofs_alpha << max_val << std::endl;

    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            ifs >> r >> g >> b;
            min_rgb = std::min(r, std::min(g, b));
            if (min_rgb == 0) {
                na = max_val;
                nr = r;
                ng = g;
                nb = b;
            } else if (min_rgb == max_val) {
                na = 0;
                nr = max_val;
                ng = max_val;
                nb = max_val;
            } else {
                na = max_val - min_rgb;
                nr = (r + na - max_val) * max_val / na;
                ng = (g + na - max_val) * max_val / na;
                nb = (b + na - max_val) * max_val / na;
            }
            ofs_color << nr << " " << ng << " " << nb << " ";
            ofs_alpha << na << " ";
        }
        ofs_color << std::endl;
        ofs_alpha << std::endl;
    }
    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

透過だからアルファチャンネルと安易に考えるのはあまり良くないです

Photoshopでレイヤーの合成に乗算という項目がありますが
これは上下の画像のRGBの演算のみで
画像が濃く重なったような効果が作成できます

私は判子などを重ねるときはこれを使用します

乗算のイメージ
これはRGBの各値(0...255)を(0...1)に正規化し
字義通りかけ合わせることによって合成します

ブレンドモードをもったライブラリを使えば
もっと楽にできると思います
ブレンドモードはCanvasにもOPENGLにもあります

技術的には下記が参考になるかもしれません
詳しそうな解説→

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/23 09:04

    Photoshop ですべての作業が行える時は、おっしゃるような手法で良いと思っています。
    それ以外の画像ライブラリを簡易に使う場合や、Acrobat 等で処理するための前処理が必要でした。

    キャンセル

+1

下に敷く素材が請求書などのように
白地に文字が乗っているようなものであれば、
photoshopで印鑑画像に対して「カラー比較(暗)」などに設定すればよいのでは?

そういうことではなくプログラム的に処理したいということでしょうか。
意図がずれていたらすみません。。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/01 17:11

    ありがとうございます。手早く、良い感じのものが出来そうです。
    ただ、黒の字の上に押印したとき、重なったところは少し赤く(暗い赤に)なりますよね。
    その表現もするには、半透明でないと難しいのではないかと考えています。

    キャンセル

-2

おもしろそうな課題ですね。ちょっとチャレンジしてみるかな...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/01 11:13

    ありがとうございます。255で割って…と、面倒な処理をする方法以外に良い方法はないか…と思うのです。(除算をテーブルで済ませれば早いですが、そういう意味ではなく)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    c++におけるfstreamについて

    以下のプログラムにおいて、 fstreamの使い方の勉強をしているのですが、 質問です。 text.txtに0~21までの数字が入っています。 この0~21までの数字のデータを読み

  • 解決済

    gccによる文字コード変換

    今回、C言語でファイルを読み込みそのファイルの文字コードをShift-JISに変換するプログラムを作成したのですが,変換後の文字が以下のソースコードを使用すると表示されません.どこ

  • 解決済

    文字列の結合をC言語で行う方法

    3つ以上の文字列を結合する方法 例えば・・・ char char_a[10]="aaa"; char char_b[10]="bbb"; char char_c[10]="cc

  • 解決済

    アドレスが等しくならない ポインタ

    このコードでptrポインタが示すアドレスとnumberのアドレスが同じになりません。 int *ptr=new int()が原因なのかなと考えているのですが、なぜアドレスが同じにな

  • 解決済

    出入力c++

    入出力のコードを書いていたのですが、エラーがでてしまいます。 問題点を指摘してくださるとうれしいです。 コード /*  * stream.cpp  *  *  Created on

  • 受付中

    C++ ファイル名を指定して中身を自動で定義

    C++での質問です。 前提としてファイルがあり、 ファイル名が A その中身に ab.mp4 ac.mp4 ad.mp4 が在るとします。 ファイル名のみを指定し

  • 解決済

    コンソールに日本語をキレイに出力したい

     Ⅰ. やりたいこと ファイルを読み込み、コンソールに日本語をキレイに出力したいです。 以下の画像が理想の出力です。  Ⅱ. 発生している問題 ファイル形式が

  • 解決済

    main(int argc, char *argv[])の書き方

    int mainx(int argc, char *argv[]);と宣言されています。 実装部 int mainx(int argc, char *argv[]){ }

同じタグがついた質問を見る

  • Photoshop

    100questions

    Photoshopとは、アドビシステムズ(株)が開発した画像編集のソフトウェアです。 イラストレーターや印刷業界などで幅広く使われている他、初心者や一般向けの写真編集用に開発されたソフトもあります。 専用に開発されたフィルターやプラグインを追加すると、機能を拡張することができます。

  • ImageMagick

    92questions

    ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

  • Illustrator

    53questions

    Illustratorは、アドビシステムズ(株)が開発した描画ツールソフトです。 イラスト製作やロゴタイプ、広告作成時などのデザインツールとして、さまざまな分野のクリエーターに愛用されています。 プラグインの中にCADや3DCG機能の拡張ができるものがあります。 特に広告作成などの印刷業界では、トップクラスのシェアを誇っているソフトです。

  • Inkscape

    7questions

    Inkscape(インクスケープ)はオリジナル画像やオリジナルロゴの作成、写真の加工が出来るソフトです

  • GIMP

    6questions

    画像編集、加工ソフト