在EPUB.js中,如果需要实现自动缩放,通过添加smartimages.js就可以实现图片自动缩放了,经过研究smartimages.js,发现,他可以是实现图片的缩放,但只能实现图片比需要显示的空间高时才会把图片缩小,因此,对于比较宽的图片就会出现截断的问题,经过对smartimages.js的修改我实现了通过smartimages.js实现EPUB.js电子书阅读的图片自动缩放。

EPUB.js的图片缩放是通过EPUB.js的Hooks功能实现的,smartimages.js的第一行代码就是:

EPUBJS.Hooks.register("beforeChapterDisplay").smartimages

EPUB.js会在每一章数据加载并开始显示是调用该函数。他原来的实现如下:

EPUBJS.Hooks.register("beforeChapterDisplay").smartimages = function(callback, renderer){var images = renderer.contents.querySelectorAll('img'),items = Array.prototype.slice.call(images),iheight = renderer.height,//chapter.bodyEl.clientHeight,//chapter.doc.body.getBoundingClientRect().height,oheight;if(renderer.layoutSettings.layout != "reflowable") {callback();return; //-- Only adjust images for reflowable text}items.forEach(function(item){function size() {var itemRect = item.getBoundingClientRect(),rectHeight = itemRect.height,top = itemRect.top,oHeight = item.getAttribute('data-height'),height = oHeight || rectHeight,newHeight,fontSize = Number(getComputedStyle(item, "").fontSize.match(/(\d*(\.\d*)?)px/)[1]),fontAdjust = fontSize ? fontSize / 2 : 0;iheight = renderer.contents.clientHeight;if(top < 0) top = 0;if(height + top >= iheight) {if(top < iheight/2) {// Remove top and half font-size from height to keep container from overflowingnewHeight = iheight - top - fontAdjust;item.style.maxHeight = newHeight + "px";item.style.width= "auto";}else{if(height > iheight) {item.style.maxHeight = iheight + "px";item.style.width= "auto";itemRect = item.getBoundingClientRect();height = itemRect.height;}item.style.display = "block";item.style["WebkitColumnBreakBefore"] = "always";item.style["breakBefore"] = "column";}item.setAttribute('data-height', newHeight);}else{item.style.removeProperty('max-height');item.style.removeProperty('margin-top');}}item.addEventListener('load', size, false);renderer.on("renderer:resized", size);renderer.on("renderer:chapterUnloaded", function(){item.removeEventListener('load', size);renderer.off("renderer:resized", size);});size();});if(callback) callback();}

从上面的代码可以看出,他只计算了高度,如果高度大于iheight,就修改图片的高度样式为特定的高度,并没有对高度进行处理。

经过分析,EPUB.js可以对图文进行分栏显示,如果我要对宽度超出的显示宽度的图片进行缩放,就需要知道显示区域的宽度。经过浏览器的调试工具和代码搜索,终于发现,EPUB.js的数据显示是通过一个叫做cloumnWidth的样式来决定显示区域的宽度的。

var columnWidth = parseInt(item.ownerDocument.documentElement.style[EPUBJS.core.prefixed('columnWidth')]);

这个columnWidth具体的名称是有EPUBJS的一个前缀决定的,可能是考虑到浏览器兼容的关系。为了得到图片的document对象,可以通过对象的ownerDocument获得文档对象,由于EPUB.js的显示是通过在内嵌的iframe组件显示的,所以需要得到显示的根文档对象,通过documentElement获得文档的元素,再取得其样式,这个样式通过prefixed的属性取得的,通过上面的代码就可以取到时间显示区域的宽度。

以下是代码修改部分(只贴了相关部分):

var columnWidth = parseInt(item.ownerDocument.documentElement.style[EPUBJS.core.prefixed('columnWidth')]);
if (item.clientWidth > item.clientHeight){//land imageif (item.clientWidth > columnWidth){item.style.width = "100%";item.style.height = "auto";// recheck clientHeightif (item.clientHeight > top + iheight){item.style.width = "auto";item.style.height = "100%";item.align = "middle";}}else if (item.clientHeight > top + iheight){item.style.width = "auto";item.style.height = "100%";}else{item.style.width = "auto";item.style.height = "auto";}
}else{// port imageif (item.clientHeight > top + iheight){item.style.width = "auto";item.style.height = "100%";//recheck clientWidthif (item.clientWidth > columnWidth){item.style.width = "100%";item.style.height = "auto";}}else if (item.clientWidth > columnWidth){item.style.width = "100%";item.style.height = "auto";}else{item.style.width = "auto";item.style.height = "auto";}
}
item.style.display = "block";
item.style.marginLeft = "auto";
item.style.marginRight = "auto";

上面的代码就是监测img组件的clientWidth和clientHeight来比较现实区域的高度和宽度的,在通过设定对象的宽度和高度样式。这里需要注意两点:

1. 要实现图像的缩放,其实很简单,比如,如果需要把一个图片的宽度设定到区域的100%,那么他的宽度就是显示区域的宽度,而高度设置为auto即可,这样图片的比例就可以得到保证,相反也是可以得,为了美观,我设置了图片居中,,把图片放在中间会比较好看些。注意:设置align为middle是无效的,需要设置display为block,再把marginLeft, marginRight样式修改为auto才可以然图片居中。

2. EPUB.js在调用该函数的时候,前面一次调用,img的clientWidth和clientHeight为0,后面一次的调用才会是图片的实际大小,为此,我在size函数的前面加上了一句:

function size() {// return while item has not client positionif (item.clientWidth == 0 && item.clientHeight == 0) return;//...
}

为此完美解决了EPUB.js在图片显示时图片裁剪的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/yin138/p/4902241.html

EPUB.js 解决图片裁剪问题(缩放问题)相关推荐

  1. js截取图片 裁剪图片之cropper.js插件用法详解

    js截取图片 裁剪图片之cropper.js插件用法详解 源码:https://github.com/fengyuanchen/cropper 引入+使用 <link href="/p ...

  2. js实现图片裁剪功能

    写项目遇到了一个图片裁剪功能,网上搜了半天全是裁剪框,并不能达到实际意义的图片裁剪 它的实现过程主要是 canvas 的 putImageData() 方法 w3c给它的官方定义是: putImage ...

  3. think php 缩放图片,thinkphp图片裁剪、缩放、加水印方法

    thinkphp图片裁剪.缩放.加水印方法如下: /** * 图像的裁剪.缩放.加水印 * @param string $path 路径 * @param int $width 裁剪的宽度/限制的高度 ...

  4. php剪裁图片,PHP实现图片裁剪与缩放的几种方法

    图片指定大小然后由php相关函数来实现图片裁剪功能,前段的js效果在这里就不介绍了,大家可以到网上找有很多这类代码,我只整理了php操作部份. 方法一  代码如下 复制代码 图片裁剪缩放函数,支持方位 ...

  5. php gif裁剪,PHP实现图片裁剪与缩放的几种方法

    $start_y 起始位置Y(当选定方位模式裁剪时,此参数不起作用) * @return 裁剪图片存储路径 */ function thumb($src_file, $new_width, $new_ ...

  6. js实现图片裁剪效果

    注意:img设置clip样式属性时要先设置position:absolute. 裁剪的效果其实由两张图叠加形成 <!DOCTYPE html> <html lang="en ...

  7. smartcrop.js智能图片裁剪库

    今天将为大家介绍一款近期github上很不错的开源库 – smartcrop.js.它是一款图片处理的智能裁剪库.在很多项目开发中,经常会遇见上传图片的场景,它可能是用户照片信息,也可能是商品图片等. ...

  8. 用JS解决图片太大,把网站撑变形的问题

    方法如下: 1.找到博客目录下SCRIPT/common.js文件内加入以下代码(不要加错了) //************************************************** ...

  9. 网页端基于js的图片裁剪

    效果预览 点击下载前往码云下载相应js 使用说明 CDN 使用 <script src="croptool.min.js"></script> <sc ...

最新文章

  1. 翻译机之后,搜狗再推智能硬件产品录音笔
  2. ExecutorService为创建的线程池ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE)
  3. javascript深入理解js闭包
  4. swiper.js 多图片页面的懒加载lazyLoading
  5. Beautiful Soup的用法
  6. 进程间通信IPC(二)(共享内存、信号、信号量)
  7. 34观察者模式(Observer Pattern)
  8. WebService技术详解CXF
  9. Dynamic CRM 2013学习笔记(四十二)流程5 - 实时/同步工作流(Workflow)用法图解...
  10. python里 t_python中的“.T”操作
  11. Spoj REPEATS 后缀自动机+set
  12. 信号计算机联锁试题,计算机联锁试题.doc
  13. 利用Fiddler作为网络代理
  14. python 实现Web版股票行情界面
  15. ACE+TAO 通信中间件
  16. 手机测试相关基础知识
  17. leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
  18. oracle导入dmp秒退,Oracle导入dmp遇到问题解决
  19. Unity3D占用内存详细解答
  20. 给生活添加更多乐趣!便携实用的迷你打印机-咕咕机GT1体验

热门文章

  1. liferay6.2 struts2 request.getparameter取值为null
  2. 未发现数据源名称_在Power BI中管理数据源Analysis Services
  3. js声明变量的三种方式
  4. python3安装过程中出现的ssl问题,No module named _ssl或者renaming “_ssl“ since importing it failed
  5. 记录工作中第一次解决bug的小事
  6. 理解cookie与token(JWT)
  7. matplotlib(五)排版布局
  8. 《leetcode》longest-consecutive-sequence
  9. 【源码分析】storm拓扑运行全流程源码分析
  10. 数据库连接数过多 too many