#!/usr/bin/perl
require 'cgi-lib.pl';
my $me = "variation.cgi";
my %input;
&ReadParse(\%input);
my $base = $input{'base'};
my $shape = $input{'shape'};
$shape = 0 if($shape eq '');
my $color = $input{'color'};
$color = 0 if($color eq '');
my $form_str = createForm();
createCss();
my $msg = createMsg();
print << "__END__";
Content-type:text/html
自動バリエーション
[kei\@sodanのトップ] /
[HTML作成支援のトップ]
カラーバリエーション自動作成
☆Mozilla系でもちゃんと見れるようにしました。
$msg
$form_str
__END__
if($color == 0){
@A = rgb2hsv(0x00, 0x33, 0x66);
@B = rgb2hsv(0x33, 0x33, 0x99);
@C = rgb2hsv(0xff, 0xff, 0xdd);
@D = rgb2hsv(0x33, 0x33, 0x99);
for($i = 0; $i < 12; $i++){
$shift = $i * 30;
printStyle0(hsv2str(@D, $shift), hsv2str(@B, $shift), hsv2str(@C, 360-$shift),
hsv2str(@A, $shift), hsv2str(@B, $shift), "#ffffff" , $shape, $shift);
}
} elsif($color == 1){
@A = rgb2hsv(0x00, 0x66, 0x99);
@B = rgb2hsv(0xcc, 0xcc, 0xdd);
@C = rgb2hsv(0xee, 0xff, 0xff);
@D = rgb2hsv(0x66, 0x66, 0x99);
for($i = 0; $i < 12; $i++){
$shift = $i * 30;
printStyle0(hsv2str(@D, $shift), hsv2str(@B, $shift), hsv2str(@C, $shift),
hsv2str(@A, $shift), hsv2str(@B, $shift), "#ffffff" , $shape, $shift);
}
} elsif($color == 2){
@A = rgb2hsv(0x44, 0x44, 0x99);
@B = rgb2hsv(0x99, 0x99, 0xaa);
@C = rgb2hsv(0xdd, 0xdd, 0xff);
@D = rgb2hsv(0x44, 0x44, 0x99);
for($i = 0; $i < 12; $i++){
$shift = $i * 30;
printStyle0(hsv2str(@D, $shift), hsv2str(@B, $shift), hsv2str(@C, $shift),
hsv2str(@A, $shift), hsv2str(@B, $shift), "#ffffff" , $shape, $shift);
}
} elsif($color == 3){
@A = rgb2hsv(0x44, 0x44, 0x99);
@B = rgb2hsv(0x99, 0x99, 0xcc);
@C = rgb2hsv(0xf0, 0xf0, 0xff);
@D = rgb2hsv(0x44, 0x44, 0x99);
for($i = 0; $i < 12; $i++){
$shift = $i * 30;
printStyle0(hsv2str(@D, $shift), hsv2str(@B, $shift), hsv2str(@C, $shift),
hsv2str(@A, $shift), hsv2str(@B, $shift), "#ffffff" , $shape, $shift);
}
}
print << "__END__";
__END__
sub printStyle0 {
my($h2_color, $h2_border_color, $h2_bg_color,
$div_color, $div_border_color, $div_bg_color, $shape, $comment) = @_;
my $h2_css = createCssColor($h2_color, $h2_border_color, $h2_bg_color);
my $div_css = createCssColor($div_color, $div_border_color, $div_bg_color);
print << "__END__";
Style 0 : $comment
- タイトルの文字 : $h2_color
- タイトルの背景 : $h2_bg_color
- タイトルの境界 : $h2_border_color
- 本文の文字 : $div_color
- 本文の背景 : $div_bg_color
- 本文の境界 : $div_border_color
__END__
}
sub createMsg {
return << "__END__";
一番上のスタイルを手動で作って、それを元に自動的に色相を変化させてバリエーションを作りました。
スタイルと色を選んで、ボタンを押すと反映されます。
単純にオストワルトの色相環をくるくる回すだけではなかなかちゃんとしたスタイルが出来ないので、
適当に調整してます。例えば、一番目の「はっきり」では、枠の色と背景の色とで逆に回してます。
自動彩色とか自動配色というにはまだまだ人手が介在する点が多いけど、とりあえず一種類作れば
2,30パターンできるのは便利かなぁ、と。
いくつか微妙なパターンもあるけど、それは人手使って機械学習とかさせてみようかなぁ。
☆機械学習の実験もしてみました。詳しくはリンク先をどうぞ
__END__
}
sub createForm {
$ret = << "__END__";
__END__
return $ret;
}
sub createCss {
$h2_base =<< "__END__";
font-size : 12pt;
font-family : sans-serif;
margin : 10pt;
padding : 3pt 20pt;
__END__
$div_base =<< "__END__";
color : #333;
background-color : #fff;
border-color : #ccc;
border-style : solid;
border-width : 1pt;
margin : 0pt 10pt;
padding : 10pt 10pt;
__END__
$h2_style[0] =<< "__END__";
border-style : solid;
border-width : 1pt 1pt 0pt 2pt;
__END__
$h2_style[1] =<< "__END__";
border-style : solid;
border-width : 1px 3px 2px 1px;
__END__
$h2_style[2] =<< "__END__";
border-style : double;
border-width : 0px 1px 0px 10px ;
__END__
$h2_style[3] =<< "__END__";
border-style : solid;
border-width : 0pt 0pt 0pt 15pt ;
__END__
$div_style[0] =<< "__END__";
border-style : solid;
border-width : 0pt 1pt 1pt 1pt;
__END__
$div_style[1] =<< "__END__";
border-style : solid;
border-width : 1px 3px 2px 1px;
__END__
$div_style[2] =<< "__END__";
border-style : solid;
border-width : 1px;
__END__
$div_style[3] =<< "__END__";
border-style : solid;
border-width : 1px;
__END__
}
sub createCssColor {
return << "__END__";
$_[3]
color : $_[0];
border-color : $_[1];
background-color : $_[2];
__END__
}
#--------- hsv /rgb kinds of functions ------------------#
sub myLimit {
my($value, $lower_limit, $upper_limit) = @_;
return $lower_limit if ($value < $lower_limit);
return $upper_limit if ($value > $upper_limit);
return $value;
}
sub principalValue {
my($v, $r) = @_;
$v += $r while($v < 0);
$v -= $r while($v >= $r);
return $v;
}
sub hsv2str{
my($h, $s, $v, $shift) = @_;
my($r, $g, $b);
$h += $shift;
$h = principalValue($h, 360);
# $s = myLimit($s, 0, 1);
# $v = myLimit($v, 0, 1);
$hi = int($h / 60);
$fl = ( $h / 60 ) - $hi;
$fl = 1 - $fl if($hi % 2 == 0);
$m = $v * ( 1 - $s );
$n = $v * ( 1 - $s * $fl );
if ($hi == 0) { $r = $v; $g = $n; $b = $m; }
elsif($hi == 1) { $r = $n; $g = $v; $b = $m; }
elsif($hi == 2) { $r = $m; $g = $v; $b = $n; }
elsif($hi == 3) { $r = $m; $g = $n; $b = $v; }
elsif($hi == 4) { $r = $n; $g = $m; $b = $v; }
elsif($hi == 5) { $r = $v; $g = $m; $b = $n; }
return sprintf('#%02X%02X%02X', $r*0xff, $g*0xff, $b*0xff);
}
sub rgb2hsv {
my($r, $g, $b) = @_;
my($h, $s, $v, $x);
my $pi = 180;
$r /= 0xff;
$g /= 0xff;
$b /= 0xff;
if($r > $g && $r > $b){
$v = $r;
$x = ($g < $b) ? $g : $b;
$s = 1 - $x / $v;
$rr = ($v-$r) / ($v-$x);
$gg = ($v-$g) / ($v-$x);
$bb = ($v-$b) / ($v-$x);
$h = ( $pi / 3 ) * ( $bb - $gg );
} elsif ($g > $r && $g > $b){
$v = $g;
$x = ($r < $b) ? $r : $b;
$s = 1 - $x / $v;
$rr = ($v-$r) / ($v-$x);
$gg = ($v-$g) / ($v-$x);
$bb = ($v-$b) / ($v-$x);
$h = ( $pi / 3 ) * ( 2 + $rr - $bb );
} else {
$v = $b;
$x = ($r < $g) ? $r : $g;
$s = 1 - $x / $v;
$rr = ($v-$r) / ($v-$x);
$gg = ($v-$g) / ($v-$x);
$bb = ($v-$b) / ($v-$x);
$h = ( $pi / 3 ) * ( 4 + $gg - $rr )
}
return ($h, $s, $v);
}