同様の問題があり、実際にサブサンプリングを検出しMegaPixImage
、サブサンプリングが見つかった場合にのみ使用する便利な機能を見つけました。
私の場合、ローカル ファイルの読み取り (あなたの場合は iPhone カメラ) では、値が変更されたとき (つまり、この入力を設定するためにファイルが選択されたとき) にhandleFileSelect
関数を呼び出しました。<input type="file">
この関数内でpopulateImage
、画像データをキャンバスに描画する一般的な JS 関数を呼び出しました。
handleFileSelect
関数とinput
バインディングは次のとおりです。
$("#my_file_input").bind('change', function (event) {
handleFileSelect(event);
});
function handleFileSelect(event) {
var reader,
tmp,
file = event.target.files[0];
try {
reader = new FileReader();
reader.onload = function (e) {
tmp = e.target.result.toString();
// In my case, some image data (from Androids, mostly) didn't contain necessary image data, so I added it in
if (tmp.search("image/jpeg") === -1 && tmp.search("data:base64") !== -1) {
tmp = tmp.replace("data:", "data:image/jpeg;");
}
populateImage(tmp);
};
reader.onerror = function (err) {
// Handle error as you need
};
reader.readAsDataURL(file);
} catch (error) {
// Handle error as you need
}
}
次に、私のpopulateImage
関数(上記の関数で呼び出されreader.onload
ます):
function populateImage(imageURL) {
var tmpImage = new Image();
$(tmpImage).load(function () {
var mpImg, mpImgData;
// If subsampling found, render using MegaPixImage fix, grab image data, and re-populate so we can use non-subsampled image.
// Note: imageCanvas is my canvas element.
if (detectSubsampling(this)) {
mpImg = new MegaPixImage(this);
mpImg.render(imageCanvas, {maxWidth: 94, maxHeight: 125});
mpImgData = imageCanvas.toDataURL("image/jpg");
populateImage(mpImgData);
return;
}
// Insert regular code to draw image to the canvas
// Note: ctx is my canvas element's context
ctx.drawImage(tmpImage, 0, 0, 94, 125); // Or whatever x/y/width/height values you need
});
$(tmpImage).error(function (event) {
// Handle error as you need
});
tmpImage.src = imageURL;
}
そして最後にdetectSubsampling
機能です。このメソッドは別のソースから見つけたものであり、私自身のものではないことに注意してください。
function detectSubsampling(img) {
var iw = img.naturalWidth,
ih = img.naturalHeight,
ssCanvas,
ssCTX;
if (iw * ih > 1024 * 1024) { // Subsampling may happen over megapixel image
ssCanvas = document.createElement('canvas');
ssCanvas.width = ssCanvas.height = 1;
ssCTX = ssCanvas.getContext('2d');
ssCTX.drawImage(img, -iw + 1, 0);
// Subsampled image becomes half smaller in rendering size.
// Check alpha channel value to confirm image is covering edge pixel or not.
// If alpha value is 0 image is not covering, hence subsampled.
return ssCTX.getImageData(0, 0, 1, 1).data[3] === 0;
}
return false;
}
これはあなたが交渉した以上のものかもしれませんが、私が言ったように、私は同様の問題に遭遇し、この解決策はキャンバスがサポートされているすべてのブラウザー/デバイスで機能することが証明されました.
それが役に立てば幸い!