人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PhotoShopのJavaScriptを使って任意の位置の1ドットのRGBを取得したいと考えています。
ttp://d.hatena.ne.jp/Yappy/20071001/1191258148
などを参考にしたのですが、「channels[0].histogram」のところで取得するヒストグラムのデータが正しく取得できません。(0か255になる)何がいけないのでしょうか?

環境:OSX(10.6.8)
PhotoShop:Ver12.0.4 x64

Windows環境(SP3、PhotoShop Ver12.0 x32)では、正しく動作します。



●質問者: 匿名質問者
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● 匿名回答1号

0?255まで順番にピクセル数を調べていき、0以外の値が見つかればそれが色の輝度になります。この方法で、R、G、Bの3つのチャンネルについて調べていけば、ピクセル単位の色を読み出せる、というわけです。

ヒストグラムはhistogram配列に入っているので、0?255まで配列内容を調べていけばピクセルの輝度が取得できます。たとえばR(赤)の輝度は以下のようにして読み出せます。
data = activeDocument.channels[0].histogram;
for (i=0; i<256; i++) if (data[i] > 0) { R = i; break; }

ASCII.jp:PhotoshopのフィルターをJavaScriptで作る!|古籏一浩のJavaScriptラボ
ヒストグラムが0以外になったところが輝度です。


匿名回答1号さんのコメント
channels[0]がR、channels[1]がG、channels[2]B なんですよね。 >明度(ヒストグラムの添え字) このへん勘違いされていませんか。

匿名質問者さんのコメント
channelsの添え字とRGBの関係のご指摘の内容は理解しております。 ご回答頂いたURL先も確認していまして、ヒストグラム配列が256個取得できているのも確認してます。 上記のスクリプトで言えば、1ピクセルを選択した状態で、data[0]か、data[255]にしか値が入らないのです。 参照先を勘違いしているとは考えにくい状態です。

匿名回答1号さんのコメント
取得はできてるんですよね。(なら質問の本題は解決)。 >data[0]か、data[255]にしか値が入らないのです。 ヒストグラム配列に代入したところで書き換えることができるのですか? フィルタのサンプルをみると、selection.fillで書き換えているようですが。

匿名質問者さんのコメント
書き換えは行なっていません。以下、具体的にソースを記載します。 var pixelColor = getPixelColor(280,180); function getPixelColor(pixH,pixV){ var selRegion = null; selRegion = Array(Array(pixH, pixV), Array(pixH + 1, pixV), Array(pixH + 1, pixV + 1), Array(pixH, pixV + 1), Array(pixH, pixV)); var currDoc = app.activeDocument; currDoc.selection.select(selRegion); var histR = currDoc.channels[0].histogram; var histG = currDoc.channels[1].histogram; var histB = currDoc.channels[2].histogram; $.writeln(histR); $.writeln(histG); $.writeln(histB); var returnColor = new RGBColor(); for (iHistR in histR){ if(histR[iHistR]!=0){ returnColor.red = iHistR; } } for (iHistG in histG){ if(histG[iHistG]!=0){ returnColor.green = iHistG; } } for (iHistB in histB){ if(histB[iHistB]!=0){ returnColor.blue = iHistB; } } return returnColor; } alert(pixelColor.hexValue+"\n"+pixelColor.red+","+pixelColor.green+","+pixelColor.blue);

匿名回答1号さんのコメント
>|javascript| for (var i = 0, n = histR.length; i < n; i++){ var hist = histR[i]; if (hist > 0){ returnColor.red = hist; break; } } ||< のようにすると?

匿名質問者さんのコメント
結果は同じでした。 histR,histG,histBの値を$.writelnでコンソールに出力しているのですが、配列の中は添え字が0か、或いは、255のところに1が入っている状態です。

匿名回答1号さんのコメント
ヒストグラムを取得している任意のピクセルの輝度が0か255なのでは。

匿名質問者さんのコメント
同じPSDファイル、同じスクリプトをWindows環境で実行すると、正しくRGBが取得できているので、任意のピクセルの輝度が0か255ということはないと考えています。

匿名回答1号さんのコメント
>> Adobe Forums: x32では動作するがx64では動作しない http://forums.adobe.com/thread/919610 << こういうバグのひとつだったり

匿名質問者さんのコメント
バグだったら、、、、どうしようもないのでしょうか・・・(泣)

質問者から

ご回答有難うございます。

ヒストグラム配列の添え字が0か、255のところにしか反応しないのです。
質問中の「(0か255になる)」とは、明度(ヒストグラムの添え字)が0か255にしかならないという意味で捉えて頂ければ幸いです。


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ