大きな画像を選んでCanvasで縮小すると、下の方が真っ黒になってあれあれ?となってしまうと思う。
※コメント戴いた内容から、下記の話題へ続く。
http://qiita.com/ms2sato/items/d1e6a58b23af41e0090a
iOS6からのバグの様子。下記を参考にすべし。
http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
コード保全のため一応転載。
/**
* Detecting vertical squash in loaded image.
* Fixes a bug which squash image vertically while drawing into canvas for some images.
* This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel
*
*/
function detectVerticalSquash(img) {
var iw = img.naturalWidth, ih = img.naturalHeight;
var canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = ih;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
var data = ctx.getImageData(0, 0, 1, ih).data;
// search image edge pixel position in case it is squashed vertically.
var sy = 0;
var ey = ih;
var py = ih;
while (py > sy) {
var alpha = data[(py - 1) * 4 + 3];
if (alpha === 0) {
ey = py;
} else {
sy = py;
}
py = (ey + sy) >> 1;
}
var ratio = (py / ih);
return (ratio===0)?1:ratio;
}
/**
* A replacement for context.drawImage
* (args are for source and destination).
*/
function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
var vertSquashRatio = detectVerticalSquash(img);
ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
}
上記をどこかに定義しておいて下記のように変更してみると良い。
//context.drawImage(img, 0, 0, canvaswidth, canvasheight); //これはダメだった
drawImageIOSFix(context, img, 0, 0, width, height, 0, 0, canvaswidth, canvasheight);