HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0715
赤月画像色の変更の仕方5解決


赤月

リンク

2010/7/15(Thu) 01:12:48|NO.33678

画像を処理してiPodのCMみたいな画像を作り出すソフトを開発中なんですが、
そのテストバージョンとして、読み込んだ画像をrbg値150で
ドットの色を白と黒に置き換えるスクリプトを作ったのですが、うまく動作しません
画像の色がなぜか置き換わらないんです。
もし原因が分かる方がいらっしゃいましたら教えていただけるとありがたいです


dialog "jpg|png|bmp|gif",16,"" if stat=0 :end picload refstr,0 x=ginfo_winx y=ginfo_winy goto *shori dialog x dialog y stop *shori pget x,y if ginfo_r<150{ r=0 }else{ r=255 } if ginfo_g<150{ g=0 }else{ g=255 } if ginfo_b<150{ b=0 }else{ b=255 } color r,g,b line x,y,x+1,y if x=0{ y-1 x=ginfo_winx await 1 } if y=0:end goto *shori stop

見づらいスクリプトですみません



この記事に返信する


ANTARES

リンク

2010/7/15(Thu) 03:45:10|NO.33683

 いくつか問題点がありますが、「*shori」の定義の直後に
「title "x="+x+" y="+y」と書けば、
最も根本的な問題点がわかるでしょう。



木村

リンク

2010/7/15(Thu) 04:32:36|NO.33684

 とりあえず
<甲>:*shoriラベルが無限ループを構築してしまっている
<乙>:ドットの総当たりが上手く起動していない
<丙>:いくらawait命令でも10万回も繰り返されては恐ろしく時間がかかる
<丁>:*shoriラベルが各ドット単位の処理を意味するのか、全体の処理を意味するのか不明
このような理由から件のソースは上手く起動しないのではないかと思われます。

 で、解決方法ですが
<甲>:*shoriをサブルーチンにする
<乙>:repeat〜loop構文で総当たりを構築する
<丙>:規定回数毎にawait命令を入れる、乃至そもそも有限なのでウェイトを入れない
<丁>:*shoriラベルが何を意味すべきかをあらかじめ自分の中で固めておく
と言った方法が考えられます。

 参考までに、赤月さんのソースからこちらなりに意図を汲んで作ったソースを以下に
貼らせていただきます。(もし、赤月さんの意図が『モノクロ画像を作りたい』と言う意味だと
したら申し訳ありません)


#const DECHROMA_WINDOW 1 #const VIEW_WINDOW 0 #const DIALOG_FAILTURE 0 dialog "jpg|png|bmp|gif", 16, "" if stat = DIALOG_FAILTURE : end dechroma_set_window DECHROMA_WINDOW gsel VIEW_WINDOW : redraw 0 dechroma_convert_graphic refstr redraw 1 #module dechroma #const RED 0 #const GREEN 1 #const BLUE 2 #const COLOR_BORDER 150 #define ctype BRIGHTNESS(%1) brightness_date(check_x, check_y, %1) #define POINT_X now_x + check_x #define POINT_Y now_y + check_y #deffunc dechroma_set_window int window 内部ウィンドウ = window return #deffunc dechroma_convert_graphic str fileadress, local now_window, local now_x, \ local now_y, local check_x, local check_y, local size_x, local size_y, \ local brightness_date now_window = ginfo_sel now_x = ginfo_cx now_y = ginfo_cy buffer 内部ウィンドウ picload fileadress size_x = ginfo_sx size_y = ginfo_sy dim brightness_date, size_x, size_y, 3 repeat size_x * size_y check_x = cnt \ size_x check_y = cnt / size_x pget check_x, check_y if ginfo_r > COLOR_BORDER : BRIGHTNESS(RED) = 255 if ginfo_g > COLOR_BORDER : BRIGHTNESS(GREEN) = 255 if ginfo_b > COLOR_BORDER : BRIGHTNESS(BLUE) = 255 loop gsel now_window repeat size_x * size_y check_x = cnt \ size_x check_y = cnt / size_x color BRIGHTNESS(RED), BRIGHTNESS(GREEN), BRIGHTNESS(BLUE) pset POINT_X, POINT_Y loop pos now_x, now_y return #global



テック

リンク

2010/7/16(Fri) 21:03:57|NO.33728

>画像を処理してiPodのCMみたいな画像を作り出すソフトを開発中なんですが、
iPodのCMでググったのですが、周囲が単色(例えば赤だけなど)で
人型が黒だけで表されたものでしょうか?

>ドットの色を白と黒に置き換えるスクリプトを作ったのですが、うまく動作しません
↑の質問ですが、ドットの色が白だった場合は、黒に
黒だったら白に置き換えるという意味ではないですよね〜。

赤月さんのスクリプトを見ましたが、
150で各RGBの値を0か255にするか判断していますが、
今のままだと、各RGBの各値が150以上でないと黒に、
各RGBの各値が150未満でないと白になりません。


 R:151、G:212、B:192→黒
 R:149、G: 92、B:  0→白

しかし、上記の条件を満たさない色が発生し、
黒白以外の単色がでてきます。
R:149、G:212、B: 89
       ↓
R:  0、G:255、B:  0→緑

なので、カラー値というのは、32ビットシステムの場合
00000000 00000000 00000000 00000000
            R        G        B
最初の8ビットは、ダミービットだったかな^^;
で次の8ビットが、R(赤)の値(0〜255)
で次の8ビットが、G(緑)の値(0〜255)
で次の8ビットが、B(青)の値(0〜255)
になります。

で値は、左シフトするごとに、2のN乗倍(Nはシフト数)になります。
赤は、16ビット左シフトしているので、2の16乗
緑は、 8ビット左シフトしているので、2の 8乗
になります。
で白と黒に分ける値を、
150*65536+150*256+150=9868950にし、
各ドットのRGBの
R値を65536倍
G値を256倍
B値はそのままを合計した値と比較し、
大きければ、各RGBを255にし、小さければ0にすればいいと思います。
もし質問の意図が違っていたら申し訳ありません。

以下にサンプルスクリプトを載せておきます。

// マクロの定義 #define FILE_FILTER "jpg|png|gif|bmp" // ファイルフィルター #define DIALOG_OPTION "JPG|PNG|GIF|BMP" // ダイアログオプション // 定数の定義 #const DIALOG_TYPE 16 // ダイアログタイプ // #const REVERSE_COLOR 150 // 反転カラー値 #const REVERSE_COLOR 150 * 65536 + 150 * 256 + 150 #const MAX_COLOR 255 // RGBの各最大値 // グローバル変数宣言 g_strFileName = "" g_nImageWidth = 0 g_nImageHeight = 0 g_nRed = 0 g_nGreen = 0 g_nBlue = 0 g_nTotal = 0 // ファイルを開くダイアログを開く dialog FILE_FILTER, DIALOG_TYPE, DIALOG_OPTION // キャンセルボタンがクリックされた場合 if (stat = 0) { // HSPを終了する end // ファイルが選択された場合 } else { // 選択されたファイル名を保持する g_strFileName = refstr } // 画像ファイルをロードする picload g_strFileName, 0 // 画像の幅・高さを取得する g_nImageWidth = ginfo_winx g_nImageHeight = ginfo_winy // 縦のループ for i, 0, g_nImageHeight, 1 // 横のループ for j, 0, g_nImageWidth, 1 // 1ドットの色データを取得する pget j, i // 現座標とカラー値をタイトルに出力する title "X:" + j + " Y:" + i + " R:" + ginfo_r + " G:" + ginfo_g + " B:" + ginfo_b /* // 赤のカラー値が反転カラー値以上の場合 if (ginfo_r >= REVERSE_COLOR) { // 赤のカラー値にRGBの各最大値を代入する g_nRed = MAX_COLOR // 赤のカラー値が反転カラー値未満の場合 } else { // 赤のカラー値にRGBの各最小値を代入する g_nRed = 0 } // 緑のカラー値が反転カラー値以上の場合 if (ginfo_g >= REVERSE_COLOR) { // 緑のカラー値にRGBの各最大値を代入する g_nGreen = MAX_COLOR // 緑のカラー値が反転カラー値未満の場合 } else { // 緑のカラー値にRGBの各最小値を代入する g_nGreen = 0 } // 青のカラー値が反転カラー値以上の場合 if (ginfo_b >= REVERSE_COLOR) { // 青のカラー値にRGBの各最大値を代入する g_nBlue = MAX_COLOR // 青のカラー値が反転カラー値未満の場合 } else { // 青のカラー値にRGBの各最小値を代入する g_nBlue = 0 } */ g_nTotal = ginfo_r * 65536 + ginfo_g * 256 + ginfo_b // カラーのトータルが反転カラー値以上の場合 if(g_nTotal >= REVERSE_COLOR) { // 各RGB値に最大値を代入する g_nRed = MAX_COLOR g_nGreen = MAX_COLOR g_nBlue = MAX_COLOR // カラーのトータルが反転カラー値未満の場合 } else { // 各RGB値に最小値を代入する g_nRed = 0 g_nGreen = 0 g_nBlue = 0 } // カラー値を設定する color g_nRed, g_nGreen, g_nBlue // 矩形を塗りつぶす boxf j, i, j, i next next stop



f3d

リンク

2010/7/16(Fri) 21:44:51|NO.33736

デフォルメ

#define color_sample 3//色精度 #const track 255/color_sample dialog ,16, exist refstr if(strsize == -1){ end }; picload refstr redraw 1 repeat ginfo(12)*ginfo(13) x = cnt\ginfo(12) y = cnt/ginfo(13) pget x,y repeat 3 ci = cnt repeat color_sample+1 if ginfo(16+ci)<=track*cnt:c(ci) = track*cnt:break//色を分割 loop loop color c(0),c(1),c(2) pset x,y if(y == by){//スリープ by++ await 0 }; loop



赤月

リンク

2010/7/17(Sat) 04:04:25|NO.33743

ありがとうございます
わかりにくい説明で申し訳ありません
テックさんの解釈で正しいです

サンプルプログラム、動かしてみました
やはり変換に時間がかかるんですね
実用性は・・・、あまりないですね・・・。
いろいろとすいませんでした。
これを参考に高速化をしてみます



ONION software Copyright 1997-2023(c) All rights reserved.