html5 canvas ios限制,HTML5画布的drawImage比错误的iOS(HTML5 Canvas drawImage ra

我想调整从iOS相机上使用HTML5画布客户端拍摄的图像,但我一直在这个奇怪的错误,这错误的图像有一个错误的比率,如果运行超过〜1.5MB大

它的工作原理在桌面上,但不是在最新的iOS版本,媒体上传API。

:你可以在这里看到一个例子http://jsbin.com/ekuros/1

任何想法如何解决这个问题吗? 这是内存的问题?

$('#file').on('change', function (e) {

var file = e.currentTarget.files[0];

var reader = new FileReader();

reader.onload = function (e) {

var image = $('');

image.on('load', function () {

var square = 320;

var canvas = document.createElement('canvas');

canvas.width = square;

canvas.height = square;

var context = canvas.getContext('2d');

context.clearRect(0, 0, square, square);

var imageWidth;

var imageHeight;

var offsetX = 0;

var offsetY = 0;

if (this.width > this.height) {

imageWidth = Math.round(square * this.width / this.height);

imageHeight = square;

offsetX = - Math.round((imageWidth - square) / 2);

} else {

imageHeight = Math.round(square * this.height / this.width);

imageWidth = square;

offsetY = - Math.round((imageHeight - square) / 2);

}

context.drawImage(this, offsetX, offsetY, imageWidth, imageHeight);

var data = canvas.toDataURL('image/jpeg');

var thumb = $('');

thumb.attr('src', data);

$('body').append(thumb);

});

image.attr('src', e.target.result);

};

reader.readAsDataURL(file);

});

Answer 1:

这里是一个JavaScript的画布大小调整库,围绕在iOS设备上绘制在画布上缩放图像时所遇到的欠采样和垂直壁球问题的工作: http://github.com/stomita/ios-imagefile-megapixel

有枝节问题缩放时的alpha通道图像(因为它使用alpha通道的问题检测),并试图调整现有画布元素时,但它是第一个解决方案,我发现,其实手头的工作问题。

stomita也是StackOverflow的用户,并张贴在这里他的解决方案: https://stackoverflow.com/a/12615436/644048

Answer 2:

如果您仍然需要使用drawImage方法的长版本,你可以改变这一点:

context.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);

为此:

drawImageIOSFix(context, img, sx, sy, sw, sh, dx, dy, dw, dh);

你只需要在一些地方包括这两个函数:

/**

* 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);

// Works only if whole image is displayed:

// ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);

// The following works correct also when only a part of the image is displayed:

ctx.drawImage(img, sx * vertSquashRatio, sy * vertSquashRatio,

sw * vertSquashRatio, sh * vertSquashRatio,

dx, dy, dw, dh );

}

这将正常工作,无论是在iOS或其他平台上运行。

这是基于伟大的工作stomita ,你应该归功于他的工作。

Answer 3:

看起来这是一个iOS 6的错误。 没有理由方面,从你的代码获得走出低谷。 我有只在IOS 6中引入如此看来,他们的子采样程序给出了错误的高度相同的问题。 我提交了一个bug报告给苹果,而你也应该这样做。 更bug报告,他们得到这个好。

Answer 4:

我已经经历了同样的问题。 看来,这是一个iOS的限制,JPG超过200万像素的子采样。

请参阅创建于IPhone兼容的Web内容的Safari

Answer 5:

修改后的版本上面的代码。

编辑:看到L0LN1NJ4的在码http://jsfiddle.net/gWY2a/24/ ..想,一个人的好一点...

function drawImageIOSFix (ctx, img) {

var vertSquashRatio = detectVerticalSquash (img)

var arg_count = arguments.length

switch (arg_count) {

case 4 : ctx.drawImage (img, arguments[2], arguments[3] / vertSquashRatio); break

case 6 : ctx.drawImage (img, arguments[2], arguments[3], arguments[4], arguments[5] / vertSquashRatio); break

case 8 : ctx.drawImage (img, arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7] / vertSquashRatio); break

case 10 : ctx.drawImage (img, arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9] / vertSquashRatio); break

}

// Detects 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 (and IOS7) 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, ey = ih, 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

}

}

文章来源: HTML5 Canvas drawImage ratio bug iOS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金工如何运用计算机思维,金工实训心得体会

金工实训心得体会我们有一些启发后,就很有必要写一篇心得体会,如此可以一直更新迭代自己的想法。那么心得体会到底应该怎么写呢?以下是小编为大家整理的金工实训心得体会,希望能够帮助到大家。金工实训心得体会1时间过得真快&…

湖南女子学院 计算机,2019湖南女子学院专业排名

湖南女子学院的前身是成立于1985年的湖南女子职业大学,2010年3月18日经教育部批准升格为全日制普通本科院校。截止到目前为止,湖南女子学院重点专业共有1个专业,其中国家品牌专业0个,省部重点专业1个。下面是学习啦小编给大家带来…

2020计算机考研只考数据结构的学校,【择校必看】十三所计算机专业课只考数据结构的985院校!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼敲黑板:本文涉及到的学校计算机专业考研只考数据结构,其中部分院校同时也会考算法、C语言等相关内容。但是,相对其他几门,无疑在专业课的复习上大大降低了难度。如果各位同学目前的专…

福州3 2五年制计算机专业的学校,福州有哪些五年制大专

福州的五年制大专有福州环保职业中专学校、福建工业学校、福建理工学校、福建经济学校、福建建材工业学校、福建商贸学校、福州电子职业中专学校、福建化工学校、福建工贸学校、福州文教职业中专学校、福建经贸学校、福州商贸职业中专学校、福州工业学校、福州建筑工程职业中专…

无法删除计算机文件是什么意思,为何计算机的文件删除不了,说是被占用要解除占用...

要解决此问题,必须关闭“简单文件共享”,然后获取文件夹的所有权:1. 关闭“简单文件共享”:a. 单击“开始”,然后单击“我的电脑”。b. 在“工具”菜单上,单击“文件夹选项”,然后单击“查看”选…

石家庄计算机专接本学校有哪些,河北省内的专接本学校都有哪些?

满意答案mary3978702013.02.28采纳率:41% 等级:13已帮助:9063人防灾技术高等专科学校河北工程技术高等专科学校保定师范专科学校承德民族师范高等专科学校保定金融高等专科学校承德石油高等专科学校沧州师范专科学校沧州医学高等专科学校邢…

计算机原理转移指令题,转移指令计算机原理.pdf

转移指令计算机原理.pdf 3.3.5 程序控制指令程序控制指令 程序控制指令又称为控制转移指令,包括转移指令、循环控制指令、过程调用指令和 中断指令 4 类。转移指令又分为无条件转移指令和条件转移指令。 1无条件转移指令无条件转移指令 JMP 计算机程序的执行完全按照…

计算机一级资料书推荐,推荐版 全国计算机一级考试试题【史上最全面的资料,不看你就亏!】.doc...

一、选择题(1-30)每题1分,(31-55)每题2分,共80分)二、1.第二代电子计算机使用的电子器件是 。三、A)电子管 B)晶体管 C)集成电路 D)超大规模集成电路四、2.计算机病毒是指 。A)带细菌的磁盘 B)已损坏的磁盘C)具有破坏性的特制程序…

浙江高校计算机等级考试二级办公,浙江省高校计算机等级考试二级(高级办公)Word操作提示.doc...

浙江省高校计算机等级考试二级(高级办公)Word操作提示说明:经过多位教师的反复验证,以下操作步骤能做出与效果图一样的文档。具体操作步骤如下:1(1)~(2)操作:选择“格式”→“样式和格式”命令(或在格式工具栏上单击“格式窗格”按…

静态常量放在什么包里面_在沙雕游戏里面用表情包打架,是一种什么体验

在日常的聊天中,不少人都会随手发一些表情包表达自己的心情,其中就有不少是动物的表情包。早些时候,推特上曾经流行过一些沙雕的动物表情包,大多数都是通过视觉上的误差,许多网友发挥自己丰富的想象力,让这…

win8计算机丢失xinput1+3.dll,xinput1 3.dll丢失怎么办 win8下xinput1 3.dll丢失解决方法

xinput1 3.dll是Microsoft DirectX for Windows的控制模块,它适合于WinXP,Vista,Win7,Win8系统。当运行程序或者游戏时,系统弹出错误提示“ 找不到 xinput1 3.dll ”,或者“没有找到 xinput1 3.dll ”时,说明您系统中缺失这个dll文件或者该dll文件没有被…

场内场外交易成本_选择场内基金还是场外基金,看这篇文章就够了

基金按照买卖的渠道可分为场内基金和场外基金。有的喜欢购买场内基金,有的喜欢购买场外基金,我自己就喜欢购买场内基金。这两种基金究竟怎么选择呢?从三方面一一为你道来。一、场内、场外基金的不同1、交易渠道不同这是最简单区分场内基金和场…

数据迁移测试经验分享

以下为作者观点: 数据迁移,是在保证新旧系统业务连续性的前提下,将数据从旧数据库迁移到新数据库的过程,测试前通过迁移策略和方案了解新旧系统数据如何重构与关联,测试过程需确保数据迁移的正确性,主要体…

计算机科技学术讲座心得体会,学术报告心得体会

好文网为大家准备了关于学术报告心得体会的文章,好文网里面收集了五十多篇关于好学术报告心得体会好文,希望可以帮助大家。更多关于学术报告心得体会内容请关注好文网。ctrlD请收藏!上周四,我在信息学院听了一场3G方面的技术讲座,讲座一、9月14日晚19&am…

祖孙俩人是什么关系_一个人生活也挺好,为什么还需要亲密关系?

专注女性自我蜕变和解放,愿你面向太阳,坚定而温暖。现在很多90后,都谈婚色变,都更多的想要一个人生活,觉得生活没有压力,自己不饿,全部搞定,也有亲情和友情,也可以享受恋…

4t硬盘实际容量是多少_SMR硬盘到底能用不?点进来看看避免踩雷

***身处信息时代,随着网络带宽的增加,游戏容量越做越大,网上的高清片源也动辄几十G,再加上各种零零碎碎的学习资料,这时候电脑标配的1T、2T机械硬盘的容量就有点捉襟见肘了。越来越来多的个人用户开始组起了家庭NAS(网…

计算机进去bios方式,各种电脑进入BIOS方法汇总|进入bios的方法大全

【各种电脑进入Bios设置的方法】如今我们已经很少上电脑店去让别人给我升级或者安装系统,我们只要借助网络上的教程就可以完成系统的更新了。但是通过光盘,u盘等手段安装系统,都需要进行BIOS设置,主要是选择开机启动项。而且各种电…

怎么将翼型导入catia_CATIA导入翼型出现了问题,翼型是在网上找的。说是样条线运算有问题 - 机械 - 小木虫 - 学术 科研 互动社区...

CATIA显示两个连续点在几何上完全相同,请在位置63处选择几何上完全不同的点。但是我删除了63处的点以后,它又说62处选择几何上完全不同的点。我想知道是哪里出了问题 。谢谢下面是翼型数据点。0 0 00.000602 0 0.0031650.00…

ajax会占用服务器端内存吗,javascript - 为什么不允许在jquery datatable服务器端处理ajax成功使用? - 堆栈内存溢出...

我正在使用asp.net mvc5并尝试使用jquery datatable插件服务器端处理。 服务器端处理的教程显示了从服务器返回结果的格式。但是我的项目的不同之处在于我无法从服务器发送“数据”的类型化数组。 我发送整个tbody作为字符串与所有HTML标签。 我的数据表代码如下。var e t.Dat…

寻路机器人单片机程序示例_C51独立按键的识别示例程序

每按一次独立键盘的S2键,与P1口相连的一个发光二极管往下移动一位。#includesbit BY1P3^4; //定义按键的输入端S2键unsigned char count; //按键计数,每按一下,count加1unsigned char temp;unsigned char a,b;void delay10ms(void) //延时程序{unsigned char i…