習作、ImageDraw
ちょっとした習作なのですが、ブラウザ上のJPEG画像に落書きができて、それを実際の画像としてダウンロードできる仕組みを作ってみました。
(別に目新しくもなんともないよくあるやつだ)
画像の上でマウスをドラッグすると線が引けて、「create image」を押すと実際に画像が生成されます。
で、prototype.js(久しぶりに触った)とPHPのImage関数使ってます。
以下、ソース。
<?php
$scriptname = basename(__FILE__);
$imgfile = 'sample.jpg';
if(isset($_POST['position'])){
$pos = split(',', $_POST['position']);
$im = imagecreatefromjpeg($imgfile);
$black = imagecolorallocate($im,0,0,0);
for($i=0;$i<sizeof($pos);$i+=2) {
@imagefilledrectangle($im, $pos[$i], $pos[$i+1], $pos[$i]+1, $pos[$i+1]+1, $black );
}
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
exit();
}
?><html>
<head>
<script type="text/javascript" src="prototype.js"></script>
<style type="text/css">
<!--
* { padding: 0; margin: 0; }
#main { padding: 10px; }
#imagearea { margin: 10px 0 0 10px; }
-->
</style>
<body>
<div id="main">
<img id="image" src="<?= $imgfile ?>" />
</div>
<br />
<a id="btn_create_image" href="#">create image</a>
</div>
<script type="text/javascript"><!--
var ImageDraw = Class.create();
ImageDraw.prototype = {
initialize: function(eleimage, btnrealimage) {
this.arr = [];
this.image = eleimage;
this.btnrealimage = btnrealimage;
Event.observe(this.image, 'load', this.onLoadImage.bind(this));
},
onLoadImage: function(event) {
var ele = document.createElement('div');
var style = ele.style;
var pos = Position.positionedOffset(this.image);
style.left = pos[0];
style.top = pos[1];
style.width = this.image.width;
style.height = this.image.height;
style.zIndex = "999";
style.position='absolute';
document.body.appendChild(ele);
this.ele = ele;
this.mousestatus = false;
Event.observe(document, 'mouseup', this.onMouseUp.bind(this));
Event.observe(this.ele, 'mousedown', this.onMouseDown.bind(this));
Event.observe(this.ele, 'mousemove', this.onMouseMove.bind(this));
this.createRealImageForm();
Event.observe(this.btnrealimage, 'click', this.onPostCreateRealImage.bind(this));
},
onMouseDown: function(event) {
console.log('mouse down');
this.mousestatus = true;
Event.stop(event);
},
onMouseUp: function(event) {
console.log('mouse up');
this.mousestatus = false;
},
onMouseMove: function(event) {
if(!this.mousestatus) return;
var obj = document.createElement('div');
var style = obj.style;
style.position='absolute';
style.left = event.clientX + "px";
style.top = event.clientY + "px";
style.height = style.width = "2px";
style.backgroundColor = "black";
style.zIndex = "999";
document.body.appendChild(obj);
var pos = Position.positionedOffset(this.ele);
this.arr.push(event.clientX-pos[0],event.clientY-pos[1]);
},
createRealImageForm: function() {
var obj = document.createElement('div');
obj.innerHTML = '<form id="frm_create_real_image" method="post" action="<?= $scriptname ?>" target="_blank">' +
'<input type="hidden" name="image" value="sample.jpg" />' +
'<input type="hidden" name="position" value="" />' +
'</form>';
var style = obj.style;
style.position='absolute';
style.left = style.top = "-100px";
document.body.appendChild(obj);
this.frm = $('frm_create_real_image');
return;
},
onPostCreateRealImage: function(event) {
if(!this.frm) return;
this.frm.position.value = this.arr.join(',');
this.frm.submit();
Event.stop(event);
}
};
obj = new ImageDraw($('image'), $('btn_create_image'));
//--></script>
</body></html>
$scriptname = basename(__FILE__);
$imgfile = 'sample.jpg';
if(isset($_POST['position'])){
$pos = split(',', $_POST['position']);
$im = imagecreatefromjpeg($imgfile);
$black = imagecolorallocate($im,0,0,0);
for($i=0;$i<sizeof($pos);$i+=2) {
@imagefilledrectangle($im, $pos[$i], $pos[$i+1], $pos[$i]+1, $pos[$i+1]+1, $black );
}
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
exit();
}
?><html>
<head>
<script type="text/javascript" src="prototype.js"></script>
<style type="text/css">
<!--
* { padding: 0; margin: 0; }
#main { padding: 10px; }
#imagearea { margin: 10px 0 0 10px; }
-->
</style>
<body>
<div id="main">
<img id="image" src="<?= $imgfile ?>" />
</div>
<br />
<a id="btn_create_image" href="#">create image</a>
</div>
<script type="text/javascript"><!--
var ImageDraw = Class.create();
ImageDraw.prototype = {
initialize: function(eleimage, btnrealimage) {
this.arr = [];
this.image = eleimage;
this.btnrealimage = btnrealimage;
Event.observe(this.image, 'load', this.onLoadImage.bind(this));
},
onLoadImage: function(event) {
var ele = document.createElement('div');
var style = ele.style;
var pos = Position.positionedOffset(this.image);
style.left = pos[0];
style.top = pos[1];
style.width = this.image.width;
style.height = this.image.height;
style.zIndex = "999";
style.position='absolute';
document.body.appendChild(ele);
this.ele = ele;
this.mousestatus = false;
Event.observe(document, 'mouseup', this.onMouseUp.bind(this));
Event.observe(this.ele, 'mousedown', this.onMouseDown.bind(this));
Event.observe(this.ele, 'mousemove', this.onMouseMove.bind(this));
this.createRealImageForm();
Event.observe(this.btnrealimage, 'click', this.onPostCreateRealImage.bind(this));
},
onMouseDown: function(event) {
console.log('mouse down');
this.mousestatus = true;
Event.stop(event);
},
onMouseUp: function(event) {
console.log('mouse up');
this.mousestatus = false;
},
onMouseMove: function(event) {
if(!this.mousestatus) return;
var obj = document.createElement('div');
var style = obj.style;
style.position='absolute';
style.left = event.clientX + "px";
style.top = event.clientY + "px";
style.height = style.width = "2px";
style.backgroundColor = "black";
style.zIndex = "999";
document.body.appendChild(obj);
var pos = Position.positionedOffset(this.ele);
this.arr.push(event.clientX-pos[0],event.clientY-pos[1]);
},
createRealImageForm: function() {
var obj = document.createElement('div');
obj.innerHTML = '<form id="frm_create_real_image" method="post" action="<?= $scriptname ?>" target="_blank">' +
'<input type="hidden" name="image" value="sample.jpg" />' +
'<input type="hidden" name="position" value="" />' +
'</form>';
var style = obj.style;
style.position='absolute';
style.left = style.top = "-100px";
document.body.appendChild(obj);
this.frm = $('frm_create_real_image');
return;
},
onPostCreateRealImage: function(event) {
if(!this.frm) return;
this.frm.position.value = this.arr.join(',');
this.frm.submit();
Event.stop(event);
}
};
obj = new ImageDraw($('image'), $('btn_create_image'));
//--></script>
</body></html>