PHPでHSBまたはHSLからhexの色の値を出せるライブラリを探しています

このQ&Aのポイント
  • PHPでHSBまたはHSLからhexの色の値を出せるライブラリを探しています。HSBまたはHSLから一方通行の変換だけできれば十分です。
  • AS3で書かれたHSB変換のコードを転用する予定ですが、資料などがなかったため不安です。不要な処理や基本的な間違いがあれば指摘してください。
  • HSBまたはHSLからhexの色の値を出すためのPHPライブラリを探しています。HSBまたはHSLからの変換に特化したものであれば、他の機能は必要ありません。
回答を見る
  • ベストアンサー

色変換のライブラリ探してます

PHPでHSBまたはHSLからhexの色の値を出せるライブラリとかを探してます HSBまたはHSLから一方通行の変換だけできれば十分です また、なければ前にAS3で書いたのを 転用しようかと思ってるんですが とくになんの資料もなくテキトーに こうすればいけんじゃね?的に作ったものなので いろいろ不安です、ムダな処理とか そもそもHSBについて基本的に間違ってるとことか あったら指摘ください public static function HSBClr(H:Number,S:Number,B:Number):int { var H=Math.abs(H%360)/60; while(H<0)H+=6 var S=Math.min(Math.abs(S),100)/100 var B=Math.min(Math.abs(B),100)/100 var rtn:int=0x010101*Math.floor(B*(1-S)*255); var c=255*S*B; var r:int=0; var g:int=0; var b:int=0; if (H<1) { r=Math.floor(c); g=Math.floor(c*H); } else if (H<2) { r=Math.floor(c*(1-H%1)); g=Math.floor(c); } else if (H<3) { g=Math.floor(c); b=Math.floor(c*(H%1)); } else if (H<4) { g=Math.floor(c*(1-H%1)); b=Math.floor(c); } else if (H<5) { b=Math.floor(c); r=Math.floor(c*(H%1)); } else { b=Math.floor(c*(1-H%1)); r=Math.floor(c); } rtn+=r*0x010000+g*0x0100+b; return rtn; }

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

こういうのとか・・・? https://gist.github.com/Jadzia626/2323023

H240S18B73
質問者

お礼

ありがとうございます、そういうのです 自分で作ったのも基本的な考え方は間違ってなかったようなので 後学のためにも自分のを書き直して使うことにします PHPで動的なCSSを作るにあたっては 16進数の扱いにはなれておきたいので

関連するQ&A

  • ★★★メタ文字変換後、swfのロードに失敗する件

    【OS】Windws XP HomeEdition 【ブラウザ】InternetExplorer7 ご覧頂きまして誠に有難う御座います。 皆様のお知恵を貸して頂ければ幸いです。 現在、下記ソースで『a.swf』ファイルを読み込む様にWEBページの制作をしております。 【参考ソース】 <?xml version="1.0" encoding="shift_jis"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" /> <link rev="MADE" href="mailto:★" /> <script type="text/javascript" src="swfLoad.js"></script> <title>★★★</title> <link rel="index" href="./index.html" /> <link rel="MAIN" href="./main.html" /> <script type="text/javascript"> function getOsName() { var osName = navigator.userAgent.toUpperCase(); var rtn; if(osName.indexOf("WIN") >= 0) { rtn = "Win"; } else if(osName.indexOf("MAC") >= 0) { rtn = "Mac"; } return rtn; } function getBrowserName() { var ua = navigator.userAgent.toUpperCase(); var rtn = ""; if (ua.indexOf("MSIE") >= 0){ rtn = "Explorer"; } else if (ua.indexOf("FIREFOX") >= 0) { rtn = "FireFox"; } else if (ua.indexOf("NETSCAPE") >= 0) { rtn = "Netscape"; } else if (ua.indexOf("SAFARI") >= 0) { rtn = "Safari"; } else if (ua.indexOf("OPERA") >= 0) { rtn = "Opera"; } return rtn; } var dataID; var osVersion; var w = screen.width; var h = screen.height; if(getOsName()=="Mac"){ h-=30; } if(!(getOsName()=="Win"&amp;&amp; getBrowserName()=="Explorer")){ moveTo(0,0); resizeTo(w,h); } if(getOsName()=="Mac"&&(getBrowserName()=="FireFox"||getBrowserName()=="Safari")){ osVersion = 0; }else{ osVersion = 1; } if(w<1280){ dataID = 1; }else if(w<1600){ dataID = 2; }else{ dataID = 3; } function mailto(str){ location.href="mailto:?subject=URL???N?G?X?g&body="+parseURL(str); } function parseURL(url){ var rc = "%0D%0A"; var rtn = ""; var index = 0; for(var i=0;i<30;i++){ index = url.indexOf(","); if(index == -1){ break; } rtn += url.substr(0,index); rtn += rc; url = url.substr(index+1); } rtn+=url; return rtn; } </script> <style type="text/css"> body { margin:0px; padding:0px; background-color:#ffffff; overflow:hidden; } </style> </head> <body> <script type="text/javascript"> swfLoad(); </script> </body> </html> この状態だと当方の意向に沿ったswfの再生が可能なのですが、 W3Cチェッカーにて診断した所『メタ文字(例`>` は `&gt;` )』は変換した方が正式な書き方だと言う事が判りました。 http://www.esitenet.com/htmllint/htmllint.html しかし、この基準に沿って全ての『メタ文字』を変換した所、今まで正常に再生されていたswfは再生されなくなり、『dateIDは宣言されていません』とエラーが返って来る様になりました。 W3Cチェッカー上での正式な書き方としての点数は上がりましたが、この問題をバランス良く解決するにはどうすれば良いか困惑しております。 上記の問題点がお判りの方がいらっしゃいましたら、是非とも対処方法をご教授願いたく投稿させて頂きます。 大変お手数ですが、何卒よろしくお願い致します。

  • それぞれの表記の色を変えるには?

    先日、日数カウンターの代わりに、表記を変えるには という質問をして、お答えを頂き、無事解決したのですが、また新たな壁にぶつかってしまいました・・・ <script type="text/javascript"> <!-- var tday=new Date(); var bday=new Date(2013,2-1,4); var days=Math.floor((tday.getTime()-bday.getTime())/(24*60*60*1000));if(days>=301){document.write("良く出来ました");} else if(days>=100){document.write("あともう少し");} else if(days>=51){document.write("この調子で");} else {document.write("頑張りましょう");} // --> </script> というプログラムで、 以下のように変更して、文字の色を変える事はできたのですが <font color="#0000ff"><script type="text/javascript"> <!-- var tday=new Date(); var bday=new Date(2013,2-1,4); var days=Math.floor((tday.getTime()-bday.getTime())/(24*60*60*1000));if(days>=301){document.write("良く出来ました");} else if(days>=100){document.write("あともう少し");} else if(days>=51){document.write("この調子で");} else {document.write("頑張りましょう");} // --> </script></font></td> 以下のように、その表記別に色を変える方法が分かりません 良く出来ました   赤 font color="#ff0000 あともう少し     青 font color="#0000ff この調子で     黄色 font color="#ffff00 どなたか、分かる方がいらっしゃいましたら、どうか宜しくお願い致します。

  • ライブラリ関数について教えてください

    C言語を独学で勉強しています。 ファイルの中のデータと配列データが一致するかを調べるプログラムを作ろうとしています。 しかし、私が作っているプログラムでは表示結果が正しくありません。 char型では==を使って一致かどうかを調べることが出来ないので、ライブラリ関数を使う必要があることを知ったのですが、調べてもよくわかりませんでした・・・ どのように作ればいいのか詳しく教えていただけないでしょうか。 よろしくお願いします。 #include<stdio.h> struct test { char no[5]; char name[10]; char english[5]; char math[5]; }; int main(void){ FILE *fp; int i; char f_no[5], f_name[5]; struct test data[5] = { {"001","akemi","100","40"}, {"002","tadao","59","76"}, {"003","mika","94","69"}, {"004","hiroshi","54","98"}, {"005","kazu","39","57"} }; struct test *test_p; test_p = data; if ((fp = fopen("test.txt", "r")) == NULL) { printf("NOT OPEN FILE\n"); } else { while (fscanf(fp, "%s%s", f_no, f_name) == 2) { for(i = 0; i<=5; i++) { if((test_p->no == f_no) && (test_p->name == f_name)) { printf("%s %s 英語%s 数学%sです。\n", f_no, f_name, test_p->english, test_p->math); } else { printf("%s %s 一致しません\n", f_no, f_name); break; } ++test_p; } } } fclose(fp); }

  • 分数を表示するプログラム(長文です)

    (整数値)aの値と(整数値)bの値をキーボードから入力して、そこから、a/bという分数を作るプログラムを書きたいと思います。(符号や約分も考えた形にする) 僕は、ヒントを参考に以下のようなプログラムを書いたのですが、ある条件の下では、正しく動きません。 ・aの値が負の場合 ・aもbも負の値の場合 など・・・ #include <stdio.h> #include <math.h> int main ( void ) { int a,b; int k,min,sign; printf("a=?");scanf("%d",&a); printf("b=?");scanf("%d",&b); if (a*b<0) sign = -1; else sign = 1; a = sign*a ; b = sign*b; if (abs(a)>abs(b)) min = b; else min = abs(a); for ( k=2 ; k<=min ; k++){ if (min%k == 0){ a = a/k; b = b/k; } } printf("a/b = %d",a); if (b != 1) printf("/%d\n",b); else printf("\n"); return 0; } これをどのように修正すれば、正確な答えが出るのでしょうか? 教えてください。

  • javascriptによる複数の円の描画

    http://okwave.jp/qa/q8255766.htmlの質問のつづきになります。 回答いただいた以下の円を複数(3つ以上)描きたいとき、 //ここに追加 の部分に単純に たとえば ctxt.arc(150, 100, radius, 0, Math.PI*2, false); ctxt.arc(0, 0, radius, 0, Math.PI*2, false); と足しても円は綺麗にならず添付した画像のように不思議な図形になります。 すみません。回答いただけたらと思います。 何卒よろしくお願いいたします。 var canvas = document.getElementById('test'), ctxt = canvas.getContext('2d'); var rmin = 1, rmax = 25, diff = 1, radius = rmin; var r = 0, g = 255, b = 0; var dc = Math.floor(255/rmax), dr = dc, dg = -dc, db = 0; var timer = setInterval(function(){ canvas.width = 255;//canvas clear ctxt.fillStyle = 'rgb(' + r +',' + g + ',' + b + ')'; ctxt.arc(100, 80, radius, 0, Math.PI*2, false); //ここに追加 ctxt.fill(); radius += diff; if(radius >= rmax){ diff = -1; db = dc; dr = -dc; r = 255; b = 0; g = 0; } if(radius <= rmin){ diff = 0; db = 0; dr = 0; r = 0; b = 255; g = 0; } r += dr; g += dg; b += db; }, 200);

  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash
  • C言語 2次方程式の解を求めるプログラム

    ポインタを使った2次方程式の解を求めるプログラムを作りたいのですが、どこが間違っているのか分かりません。 #include<stdio.h> #include<math.h> int quadEq(int a, int b, int c, double *px1, double *px2) int main() { int a,b,c,s; double x1,x2; printf("?"); scanf("%lf",&a); printf("?"); scanf("%lf",&b); printf("?"); scanf("%lf",&c); if((s=quedEq(a,b,c, &x1, &x2))==2){ printf("%f %f", x1,x2); // 解が二つ } else if(s==1){ printf("%f", x1);// 重解 } else { printf("No real solution");// 虚数解 } } int quadEq(int a, int b, int c, double *px1, double *px2) { int d = b*b-4*a*c; if(d>0){ *px1 = (-b+sqrt(d))/(2*a); *px2 = (-b-sqrt(d))/(2*a); return 2; } else if(d==0) { *px1=-b/2*a; *px2=-b/2*a; return 1; } else { return 0; } } エラーは mondai.c: 関数 ‘quadEq’ 内: mondai.c:5:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before {’ token { ^ mondai.c:26:1: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token { ^ mondai.c:39:1: エラー: expected ‘{’ at end of input } ^ となりました。括弧の位置の間違いや入れ忘れはないと思うのですが、何か根本的なミスがあるのでしょうか。添削お願いします。

  • 型変換の問題?

    次のプログラムなんですが #include <stdio.h> #include <math.h> #include <cstdlib> #include <iostream.h> void main(){ double v[10000]; for(int b=0;b<10000;b++){ v[b]=2.5+0.01*(double)(rand()%249+1);} for(b=0;b<10000;b++){ int c=(int)(100.*v[b])-251; if(c==192){printf("%d %f\n",c,v[b]);} }} 私の環境のVC++6.0 on win2kのもとで やってみると、printf("%d %f\n",c,v[b])のところで 192 4.43 となったり 192 4.42 となったりします。 真の値は、192 4.43のつもりでプログラムを組んだのですが、 なぜかc=(int)(100.*v[b])-251;という写像は 単射になっていないようです。 さて、質問ですが、double→int型の型変換に原因があるのでしょうか?

  • 条件付書式?色をつけたり空白にしたい。

    B7   C7   D7   E7   F7   G7   H7 各セルの表示は 7:31 17:00 465 1020 7:45 17:00  2:00 各セルの数式は B7,C7,H7はセルの書式設定で##":"##(このセルに数字を入れるだけにしてます) D7=INT(B7/100)*60+CEILING(MOD(B7,100),15) E7=INT(C7/100)*60+FLOOR(MOD(C7,100),15) F7=INT(D7/60)*100+MOD(D7,60) G7=INT(E7/60)*100+MOD(E7,60)になっています。 例えば、 B7セルに6:25としたら7:00より前なのF7セルのフォントとパターンの色を変えて  C7セルに18:52としたら18:00より後なのでG7セルのフォントとパターンの色を変える、 そしてC7セルが、空白の時はB7,F7,G7,H7セルを空白にしたいのですが、 よく分かりません、教えて頂けますか?

  • JavaScript/HTML5での図形の描写

    canvasを使って図形の描写をするコードを書いています。 javascript初心者なりに考え、調べたのですがどうしてもわからなかったのでどなたか教えてください。 「入力された値を半径とした円をcanvas内のランダムな位置に、ランダムな色で複数描写する」という風にしたいのです。値は好きなだけ入れれるようにしてあります。現段階でランダムな位置に描写することはできるのですが、黒縁の白い円しか描写できません。「ランダムに彩色する」部分をどのように記述したらよいのかご教授願います。 【以下書いたコード】 function draw() { var canvas = document.getElementById('mycanvas'); var ctx = canvas.getContext('2d'); var r = parseInt(document.getElementById("radius").value); ctx.beginPath(); var drawPointX = Math.floor( Math.random() * 1200 ) + 1; var drawPointY = Math.floor( Math.random() * 600 ) + 1; ctx.arc( drawPointX, drawPointY, r, 0, Math.PI*2, true ); //ランダムな色を生成・彩色する var r = parseInt(Math.random() * 255); var g = parseInt(Math.random() * 255); var b = parseInt(Math.random() * 255); var alpha = Math.random(); var rgba = "rgba("+r+", "+g+", "+b+", "+alpha+")"; ctx.fillStyle=rgba; ctx.stroke(); }