HTML5
Canvasをピクセル単位で処理するための配列のようなデータです。 横幅 x 高さ x 4(Red,Green,Blue,Alpha)の大きさになります。
20x20なら1600
特定のpixelにアクセスする場合は、(ywidth+x)4の位置
一度取り出したら、putするまで反応されない。
context2dからgetImageData(x,y,width,height)
context2dからcreateImageData(width,height)
context2dからputImageData(width,height)
大きい画像のレタッチをやりたい場合、スクロールが邪魔な場合がある。
ontouchstart
で、preventdefault
呼ぶといい。
その場合残りは、ontouchmove,ontouchendで処理することになる。
canvasのイベントのontouchstart
で重い処理をしないこと
仮に、スクロール防止の為に、preventdefault
呼び出しても、なぜか効かなくなる。
例(java-GWT)
public static void drawCenter(Canvas canvas,ImageElement image,int offsetX,int offsetY,double scaleX,double scaleY,double angle,double alpha){
canvas.getContext2d().save();
double rx=(canvas.getCoordinateSpaceWidth())/2;
double ry=(canvas.getCoordinateSpaceHeight())/2;
canvas.getContext2d().translate(rx,ry);//rotate center
double rotate=(Math.PI / 180)*angle;
canvas.getContext2d().rotate(rotate);
canvas.getContext2d().translate(-rx,-ry);//and back
canvas.getContext2d().scale(scaleX,scaleY);
double px=(canvas.getCoordinateSpaceWidth()/scaleX-image.getWidth())/2;
double py=(canvas.getCoordinateSpaceHeight()/scaleY-image.getHeight())/2;
//LogUtils.log("w="+canvas.getCoordinateSpaceWidth()+",scaled="+(element.getWidth()*scale));
//LogUtils.log("scale:"+scale+",x="+px+",y="+py);
int ox=(int) (offsetX/scaleX);
int oy=(int) (offsetY/scaleY);
//canvas.getContext2d().rotate(-rotate);
double x=ox;
double y=oy;
//offset is effect on angle,but scroll no need do it
double nx = px+x * Math.cos(-rotate) - y * Math.sin(-rotate);
double ny = py+x * Math.sin(-rotate) + y * Math.cos(-rotate);
canvas.getContext2d().translate(nx,ny);
canvas.getContext2d().setGlobalAlpha(alpha);
canvas.getContext2d().drawImage(image, 0,0);
canvas.getContext2d().restore();
}
基本的に、Canvasでリサイズすると、速度優先のため、ギザギザが目立ちます。 これを改善するには、別途自分で変換する必要があります。
Stackoverflowに素晴らしいサンプルコードがありました。
この方法を使うと、Picasaと同等の品質でリサイズできました。
画像とか描く場合、通常、width,heigtなどを、画像と同じにしていますが これを、単純に2倍・4倍とすると、大きく表示できます。
そして、この時に、発生するマウスイベントの座標を、そのズームで割ると、普通に動きます。
ただし、若干精度は悪いですが