SQLの窓

2016年05月01日


EASELJS を使用した画像の縮小とトリミングと角丸マスク / 画像は new Image でイベント処理して画像サイズを取得します

当然ではありますが、ブラウザが画像をロードし終わらないと、JavaScript でサイズを知る事ができません。EASELJS の createjs.Bitmap の引数は、文字列の URL では無く Image オブジェクトを使用しています。

画像サイズが解ったら、そのサイズを使って計算し、scaleX と scaleY で縮小します。

トリミングは createjs.Rectangle で四角形を作成して、Bitmap の sourceRect プロパティに設定します。表示位置は、x プロパティと y プロパティStage の中の位置を設定します。

画像を角丸にする為、Shape オブジェクトで画像に合った角丸の形状を作成して、Bitmap の mask プロパティに設定します。




実際の画像 1200x900
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script>
if ( typeof createjs === 'undefined' ) {
	document.write("<"+"script src=\"https://code.createjs.com/easeljs-0.8.2.min.js\"></"+"script>");
}
</script>
<script>
$(function(){
	$("#tm_action").on("click", function(){

		// トリミング
		var rect = new createjs.Rectangle(700, 300, 200, 200);
		bitmap.sourceRect = rect;
		bitmap.x = 10;
		bitmap.y = 10;

		stage1.update();

	});

	$("#mask_action").on("click", function(){

		shape.graphics.drawRoundRect(10, 10, 200, 200, 16, 16);
		bitmap.mask = shape;

		stage1.update();
	});

	$("#clear_action").on("click", function(){

		bitmap.mask = null;
		stage1.clear();

	});

});
</script>
<input type="button" value="トリミング" id="tm_action">
<input type="button" value="角丸マスク" id="mask_action">
<input type="button" value="クリア" id="clear_action">
<br>
<canvas id="load_area1" width="400" height="220" style='border:1px solid #000000'></canvas><br><canvas id="load_area2" width="400" height="300" style='border:1px solid #000000'></canvas>
<script>
var stage1 = new createjs.Stage("load_area1");
var stage2 = new createjs.Stage("load_area2");
var bitmap,shape;

img = new Image()
img.onload = function() {

	// トリミング用 bitmap
	bitmap = new createjs.Bitmap(this);
	stage1.addChild(bitmap);

	// マスク用 shape
	shape = new createjs.Shape();

	var bitmap_all = new createjs.Bitmap(this);
	bitmap_all.scaleX = 400/bitmap_all.image.width;
	bitmap_all.scaleY = 300/bitmap_all.image.height;

	stage2.addChild(bitmap_all);
	stage2.update();

}
img.src = "https://lh3.googleusercontent.com/-A5QW2HTze84/VyNZEIwxh4I/AAAAAAAAeRE/-rCcFQmsKawDMRrV6logONKz0i6LVhtYACCo/s1200/wing_elf.jpg";



</script>
easeljs のロードは、ブログの記事に書き込む事を想定して、そのページで一度きりのロードです。


posted by lightbox at 2016-05-01 19:06 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

2015年12月12日


Three.js r73 での Canvas で平面を飛翔させる為の詳細デモ

デモページ

アニメーション開始は右上のボタン
※ リロードするとアニメーション前の初期状態に戻ります

▼ 飛翔画像


以前、v57 頃の時に作成した平面の『蝶』の画像を飛翔させるデモです。バージョンがかなり変わって前のままでは動作しなくなったものを少し修正してさらに使いやすくかつ解りやすくしました。『飛翔』そのもののコードは、Three.js 内で今も使われているもので昔から全く変わっていません。この部分は、boid.js として外部ファイルとして取り出してあります。

ただ、Canvas のレンダリング部分(CanvasRenderer.js)は v73 では外部ファイルとなって Three.js 本体からは外されていました。また、さらに実行の為に Projector.js というファイルも必要になっていました。

HTML 部分
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<link rel="shortcut icon" href="http://winofsql.jp/WinOfSql.ico">

<script src="three.min73.js"></script>
<script src="CanvasRenderer.js"></script>
<script src="Projector.js"></script>
<script src="boid.js"></script>

</head>
<body style="margin:0">
<div style="position:absolute;width:98%">
<input
	type="button"
	value="アニメーション開始"
	style="position:relative;float:right;"
	onclick="window.animate();this.style.display='none'"
	title="ページをリロード(再表示)するとアニメーションは止まります">
</div>
<div id="container"></div>

<script src="birds73.js"></script>

</body>
</html>


Three.js 実行環境部分(birds73.js)
// *************************************************
// Three.js の環境設定
// *************************************************
var SCREEN_WIDTH		= window.innerWidth * 0.98;
var SCREEN_HEIGHT		= window.innerHeight * 0.98;
var SCREEN_WIDTH_HALF	= SCREEN_WIDTH  / 2;
var SCREEN_HEIGHT_HALF	= SCREEN_HEIGHT / 2;

var camera, scene, renderer,
birds, bird;

var boid, boids;

var stats;

// お決まりの初期処理とアニメーション開始
init();
// animate 内の render が実行されても、init の処理が完了していないと描画されません
// なので、アニメーション無しの1回限りの描画は、setTimeout か、画像の最終イベント内で実行します
//animate();

function init() {

	camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 );
	camera.position.z = 450;

	scene = new THREE.Scene();

	birds = [];
	boids = [];

	// 背景画像・人物画像用ラッパー
	var parent = new THREE.Object3D();

	// *************************************************
	// 背景画像の読み込み
	// *************************************************
	var image = new Image()
	image.onload = function () {

		var texture = new THREE.Texture( this );
		texture.needsUpdate = true;
		var material = new THREE.MeshBasicMaterial({map: texture, overdraw: true});

		// 平面
		var mesh = new THREE.Mesh(new THREE.PlaneGeometry(1200, 1200, 1, 1), material);

		// 画面奥
		mesh.position.z = -400;

		// 大きさ調整
		mesh.scale.x = 1.5;
		mesh.scale.y = 1.5;

		// 回転
		mesh.rotation.x = 0;
		mesh.rotation.y = 0;

		// ラッパーに平面追加
		parent.add( mesh );

		// *************************************************
		// 人物画像の読み込み
		// *************************************************
		var image = new Image()
		image.onload = function () {

			var texture = new THREE.Texture( this );
			texture.needsUpdate = true;
			var material = new THREE.MeshBasicMaterial({map: texture, overdraw: true});

			// 平面
			var mesh = new THREE.Mesh(new THREE.PlaneGeometry(778, 623, 1, 1), material);

			// 画面前
			mesh.position.z = 300;

			// 表示位置調整
			mesh.position.x = 80;
			mesh.position.y = -42;

			// 大きさ調整
			mesh.scale.x = 0.3;
			mesh.scale.y = 0.3;

			// 回転
			mesh.rotation.x = 0;
			mesh.rotation.y = 0;

			// ラッパーに平面追加
			parent.add( mesh );

			// シーンにラッパー(画像2枚)追加
			scene.add(parent);

			// *************************************************
			// 飛翔画像の読み込み
			// *************************************************
			var image = new Image()
			image.onload = function () {

				texture = new THREE.Texture( this );
				texture.needsUpdate = true;
				material = new THREE.MeshBasicMaterial({map: texture, overdraw: true});
				material.side = 2

				// 200の飛翔物体
				for ( var i = 0; i < 200; i ++ ) {

					boid = boids[ i ] = new Boid();
					boid.position.x = Math.random() * 400 - 200;
					boid.position.y = Math.random() * 400 - 200;
					boid.position.z = Math.random() * 400 - 200;
					boid.velocity.x = Math.random() * 2 - 1;
					boid.velocity.y = Math.random() * 2 - 1;
					boid.velocity.z = Math.random() * 2 - 1;
					boid.setAvoidWalls( true );
					boid.setWorldSize( 500, 500, 400 );

					// 飛翔画像を貼り付けたマテリアルを平面に適用
					birds[ i ] = new THREE.Mesh( new THREE.PlaneGeometry(30, 30, 2, 1), material );

					// オリジナルの特殊処理
					bird = birds[ i ]
					bird.phase = Math.floor( Math.random() * 62.83 );

					// 飛翔物体単位でシーンに追加
					scene.add( bird );

				}

				// 初回表示
				render();
			};
			// 飛翔画像
			image.src = "002.png";
			
		};
		// 人物画像
		image.src = "girl.png";

	}
	// 背景画像
	image.src = "moon.jpg";


	renderer = new THREE.CanvasRenderer();
	renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );

	document.addEventListener( 'mousemove', onDocumentMouseMove, false );
	document.body.appendChild( renderer.domElement );

	window.addEventListener( 'resize', onWindowResize, false );

}

function onWindowResize() {

	camera.aspect = window.innerWidth / window.innerHeight;
	camera.updateProjectionMatrix();

	renderer.setSize( window.innerWidth * 0.98, window.innerHeight * 0.98 );

	render();

}

// マウスによる、飛翔物体の反応処理
function onDocumentMouseMove( event ) {

	var vector = new THREE.Vector3( event.clientX - SCREEN_WIDTH_HALF, - event.clientY + SCREEN_HEIGHT_HALF, 0 );

	for ( var i = 0, il = boids.length; i < il; i++ ) {

		boid = boids[ i ];

		vector.z = boid.position.z;

		boid.repulse( vector );

	}

}

// Three.js のお決まりの処理
function animate() {

	requestAnimationFrame( animate );

	render();

}

function render() {

	// 飛翔物体の処理
	for ( var i = 0, il = birds.length; i < il; i++ ) {

		boid = boids[ i ];
		boid.run( boids );

		bird = birds[ i ];
		// 旧版では無かった処理
		bird.position.copy( boids[ i ].position );

		// 飛翔物体の飛翔用の傾け処理
		bird.rotation.y = Math.atan2( - boid.velocity.z, boid.velocity.x );
		bird.rotation.z = Math.asin( boid.velocity.y / boid.velocity.length() );

		// 画像を x 軸で90度回転して、横に寝かせる
		bird.rotation.x = (180 * Math.PI / 180)/2;

		// オリジナルの特殊処理
		bird.phase = ( bird.phase + ( Math.max( 0, bird.rotation.z ) + 0.1 )  ) % 62.83;

		// 平面画像のはばたき処理
		bird.geometry.vertices[ 0 ].z = Math.sin( bird.phase ) * 15;
		bird.geometry.vertices[ 2 ].z = Math.sin( bird.phase ) * 15;

		// 0  1  2
		// 3  4  5
		// セグメントが 2x1 なので、0番と 2番を動かすと、羽の先が動きます。
		// 羽全体を動かすのであれば、3番と5番も同時に値を変更してもいいです

	}


	renderer.render( scene, camera );

}



birds73.js も殆どは Three.js のサンプルと変わりませんが、Three.js では鳥に見立てた頂点を持つオブジェクトが使用されています。こちらでは、平面を 2 セグメントに分けて、頂点を6つ持ったオブジェクトの 0 番と 2番を 動かせて『飛翔』させています。
※ 詳細は、ソースコード内のコメントに書かれてあります

画像の配置

画像は全て canvas 内に配置しているので、Google Chrome や Firefox ならばそのまま保存して、その時の画像を取得する事ができます。月画像は奥に、人物画像は手前にありますが、飛翔物体がかなり手前に来た場合は人物を突き抜けるのはご愛嬌です。

画像のロードは 3種類あるので 3段階で行っています。背景 => 前景 => 飛翔画像と、各画像がロードされてから次の画像の処理へと移っています

Window サイズ変更時

全て Canvas 内なので Window サイズにあわせて表示は縮小されますが、アニメーションはそのまま実行されます。もともとは、IFRAME 内で表示する事を想定しており、お好きなサイズでページに埋め込む事ができます。



posted by lightbox at 2015-12-12 21:43 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

2015年11月16日


クリスマスに備えて、『雪を降らす snowstorm.js』のカスタマイズ / ダウンロードも何も必要ありません。jQuery も必要ありません

ダウンロードも何も必要ありません。jQuery も必要ありません。ただ、cdnjs より URL をコピーして『ページに埋め込むだけです』

配布サイトのオプションの説明

デモページ


ただ、そのままではあまりにも工夫が無いので、少しオプションを設定しています。
<style>
body {
	background-color:#000000;
}

@-webkit-keyframes snow-rotate {
  0% { -webkit-transform: rotate(0deg); }
  100% { -webkit-transform: rotate(360deg); }
}
@-moz-keyframes snow-rotate {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
@-o-keyframes snow-rotate {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
@keyframes snow-rotate {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}
.mysnow {
	color:#e0e0e0!important;
	-webkit-animation: 1.85s snow-rotate steps(8) infinite;
	-moz-animation: 1.85s snow-rotate steps(8) infinite;
	-o-animation: 1.85s snow-rotate steps(8) infinite;
	animation: 1.85s snow-rotate steps(8) infinite;

}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Snowstorm/20131208/snowstorm-min.js"></script>
<img src="https://lh3.googleusercontent.com/-Chj58uY2pjs/Vht0XOX3l-I/AAAAAAAAcCs/ijZAwj3NNQY/s1000-Ic42/silver_a2.png">
<script>
snowStorm.excludeMobile = false;
snowStorm.animationInterval = 50;
snowStorm.flakesMax = 64;
snowStorm.className = "mysnow"
snowStorm.flakeWidth = 16;
snowStorm.flakeHeight = 16;
snowStorm.snowCharacter = '&#10052;';
</script>
二つの大きなカスタマイズ

もともとは、小さな点を使っで雪を降らしていますが、キャラクタを自由に変更できるので、もともとある雪の結晶のような "❄" を使用しています。キャラクタのサイズが倍になるので、幅と高さを変更しています。

さらに、CSS のアニメーションを使用して一つ一つの雪の結晶を回転させています。

モバイル対応

モバイルで動作させるには、以下の設定が必要です。厳密な違いは解りませんが、作者は『バッテリーに悪影響あり』とほのめかしておられます。
snowStorm.excludeMobile = false;

CPU にやさしく

以下の設定は不用意に CPU を使わないようになる事が期待できます

snowStorm.animationInterval = 50;
snowStorm.flakesMax = 64;


関連する記事

雪を降らす snowstorm.js の 特定 DIV 内での実装
【改造】雪を降らす snowstorm.js に 風向きを外部から設定できるオプションを追加しました




タグ:javascript cdnjs
posted by lightbox at 2015-11-16 20:40 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

2014年03月29日


JavaScript : 誰でもすぐ使える Google 円グラフ(2) : データを Google ドキュメントから取得する



Ggdoc5
Google ドキュメントを使用して、円グラフ(visualization / piechart )を作成する
Google ドキュメントへのリンク Google ドキュメントは誰にでも使えるオンラインの Excel のようなものですが、WEB 上のデータのホスティングとしても利用する事ができます。
<style>
#chart_div iframe {
	border: solid 1px #000000;
	border-radius: 30px;
}
</style>
<div id="chart_div"></div>

<script charset="utf-8" type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">
google.load("visualization", "1", {packages: ["piechart"]});

google.setOnLoadCallback(getGoogleDoc);

var data;

// *********************************************************
// WEB(Google ドキュメント) からデータを取得
// *********************************************************
function getGoogleDoc() {

	// ターゲットとなる WEB 公開 URL
	var target = "http://spreadsheets.google.com/pub?key=";
	target += "0AtJymqpro6gScDZQZmVQZ0RNSkZCb0lqREg1bGNQQ3c&hl=ja&single=true&gid=3&output=html";

	// SQL でデータを取得
	var query = new google.visualization.Query(target);
	query.setQuery("select *");
	// データを取得後に呼び出す関数を指定
	query.send( drawChart );

}

// *********************************************************
// 円グラフ作成
// *********************************************************
function drawChart(response) {

	// エラー処理
	if ( response.isError() ) {
		alert(getDetailedMessage());
		return;
	}

	// テーブル用データ作成
	data = response.getDataTable();

	var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

	chart.draw(data, {width: 600, height: 320, is3D: true, title: '円グラフのタイトル'});
}
</script>

関連する記事

JavaScript : 誰でもすぐ使える Google 円グラフ


タグ:google
posted by lightbox at 2014-03-29 20:37 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

JavaScript : 誰でもすぐ使える Google 円グラフ

Ggpiechart

※ 凡例をクリックすると、その部分が飛び出ます
※ グラフをクリックすると、データが表示されます。
※ 誰でもすぐ使えます

addColumn を2回していますが、Excel の表を2列作ったのと同じで、タイトルとデータ型を設定して、行を7つ作っています。後は、セルにデータとタイトルをセットしていると思って下さい。





<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>google 円グラフ</title>
</head>
<body>

<div id="chart_div" style="width: 400px; height: 240px;"></div>

<script charset="utf-8" type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript">
google.load("visualization", "1", {packages: ["piechart"]});

google.setOnLoadCallback(drawChart);
function drawChart() {

	var data = new google.visualization.DataTable();
	data.addColumn('string', '対象');
	data.addColumn('number', '件数');
	data.addRows(7);

	data.setValue(0, 0, '対象A');
	data.setValue(0, 1, 2000);
	data.setValue(1, 0, '対象B');
	data.setValue(1, 1, 3000);
	data.setValue(2, 0, '対象C');
	data.setValue(2, 1, 1500);
	data.setValue(3, 0, '対象D');
	data.setValue(3, 1, 500);
	data.setValue(4, 0, '対象E');
	data.setValue(4, 1, 200);
	data.setValue(5, 0, '対象F');
	data.setValue(5, 1, 215);
	data.setValue(6, 0, '対象G');
	data.setValue(6, 1, 20);

	var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

	chart.draw(data, {width: 600, height: 320, is3D: true, title: '円グラフのタイトル'});
}
</script>

</body>
</html>


Google のリファレンス

Visualization: Pie Chart


関連する記事

JavaScript : 誰でもすぐ使える Google 円グラフ(2) : データを Google ドキュメントから取得する

Google ドキュメントを使用して、円グラフ(visualization / piechart )を作成する

jQuery + Google Visualization : 円グラフのプラグイン化


タグ:google
posted by lightbox at 2014-03-29 20:37 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする

2011年08月14日


カラーピッカーのライブラリなのですが、ちょっと雑な作りだったので、修正してリリースです。

位置移動もできるし、1アクションで色が決定できるし軽いのですが、ダウンロードしたパッケージは表示されているものより古い内容だったり、リサイズ機能もあったのですが、バグがあったので必要無いので削除しました。



FFFFFF
x
さらに必要な初期処理や色コード取得処理の説明も何も無く、名前空間も適当な作りで、プロパティ作っておいて使わずに、グローバル変数使ってたり、ID 決め打ちだったりしますが、そのぶん改造のしやすいコードです。

※ 初期化メソッドは追加しました

ここをクリックすると、以下のコードを編集しながらテストできます
<link href="http://toolbox.winofsql.jp/js/cp/plugin.css" rel="stylesheet" type="text/css" />
<div id="plugID" style='width:300px;height:70px;border:solid 1px #000'></div>
<div id="getColor" style='width:100px;height:20px;border:solid 1px #888;margin:15px 0 15px 0;'></div>
<input type="text" id="code">
<input
	type="button"
	value="色取得"
	onclick='_GLB("code").value=color.HSV_HEX(hsv);_GLBS("getColor").backgroundColor="#"+color.HSV_HEX(hsv)'
>

<div style='position:relative'>
<div id="mini" onmousedown="Picker.core('mini',event)">
   <div class="north">
      <span id="mHEX">FFFFFF</span>
      <div
          onmousedown="_GLBS('mini').display='none';"
      >x</div>
   </div>
   <div
      class="south"
      id="mSpec"
      style="height:128px;width:128px;"
      onmousedown="Picker.core('mCur',event); return false;" onselectstart="return false;"
   >
      <div
         id="mCur"
         style="top:86px;left:68px;"
      ></div>
      <img
         src="http://toolbox.winofsql.jp/js/cp/media/circle.png"
         onmousedown="return false;"
         ondrag="return false;"
         onselectstart="return false;"
      />
   </div>
</div>
</div>


<script type="text/Javascript" src="http://toolbox.winofsql.jp/js/cp/plugin.js"></script>
<script type="text/Javascript">
Picker.init(0,20);	// 位置指定
Picker.resize(300);	// 幅指定
</script>

オリジナル

Color Theory @ ColorJack

かなり前から、「フリーフォントで簡単ロゴ作成」で使っていたカラーピッカーの姉妹品なんですが、作者の興味は Canvas に移行していったようで、どちらもダウンロードできる内容はそのまま使えるようなものではありません。

Color Theory @ ColorJack の カラッピッカーの改造後のコード


posted by lightbox at 2011-08-14 22:31 | JavaScript ライブラリ | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり