itlized/javascript-load-image

JavaScript Load Image 是一个库,用于加载作为 File 或 Blob 对象提供的图像或通过 URL 提供的图像。

dev-master 2013-09-27 10:17 UTC

This package is not auto-updated.

Last update: 2024-09-23 15:06:59 UTC


README

演示

JavaScript Load Image 演示

描述

JavaScript Load Image 是一个库,用于加载作为 File 或 Blob 对象提供的图像或通过 URL 提供的图像。
它返回一个可选缩放和/或裁剪的 HTML img 或 canvas 元素。
它还提供了一个方法来解析图像元数据以提取 Exif 标签和缩略图,并在调整大小后恢复完整的图像头。

设置

在您的 HTML 标记中包含(最小化)JavaScript Load Image 脚本

<script src="js/load-image.min.js"></script>

或者,选择您想要包含的组件

<script src="js/load-image.js"></script>
<script src="js/load-image-ios.js"></script>
<script src="js/load-image-orientation.js"></script>
<script src="js/load-image-meta.js"></script>
<script src="js/load-image-exif.js"></script>
<script src="js/load-image-exif-map.js"></script>

用法

图像加载

在您的应用程序代码中,使用 loadImage() 函数如下所示

document.getElementById('file-input').onchange = function (e) {
    loadImage(
        e.target.files[0],
        function (img) {
            document.body.appendChild(img);
        },
        {maxWidth: 600} // Options
    );
};

图像缩放

也可以使用现有图像与图像缩放功能

var scaledImage = loadImage.scale(
    img, // img or canvas element
    {maxWidth: 600}
);

要求

JavaScript Load Image 库没有依赖项。

但是,JavaScript Load Image 是 Canvas to Blob 库的一个非常好的补充。

API

loadImage() 函数接受一个 FileBlob 对象或一个简单的图像 URL(例如,“http://example.org/image.png”)作为第一个参数。

如果传递了一个 FileBlob 作为参数,如果浏览器支持 URL API,则返回一个 HTML img 元素,如果支持,则返回一个 FileReader 对象,否则返回 false
当传递一个图像 URL 时,它总是返回一个 HTML img 元素

document.getElementById('file-input').onchange = function (e) {
    var loadingImage = loadImage(
        e.target.files[0],
        function (img) {
            document.body.appendChild(img);
        },
        {maxWidth: 600}
    );
    if (!loadingImage) {
        // Alternative code ...
    }
};

loadImage() 函数返回的 img 元素或 FileReader 对象允许通过将 onloadonerror 事件处理器设置为 null 来中止加载过程

document.getElementById('file-input').onchange = function (e) {
    var loadingImage = loadImage(
        e.target.files[0],
        function (img) {
            document.body.appendChild(img);
        },
        {maxWidth: 600}
    );
    loadingImage.onload = loadingImage.onerror = null;
};

第二个参数必须是一个 回调 函数,当图像加载完成后或加载图像时发生错误时调用此函数。回调函数传递一个参数,该参数是 HTML img 元素、canvas 元素或类型为 errorEvent 对象之一

var imageUrl = "http://example.org/image.png";
loadImage(
    imageUrl,
    function (img) {
        if(img.type === "error") {
            console.log("Error loading image " + imageUrl);
        } else {
            document.body.appendChild(img);
        }
    },
    {maxWidth: 600}
);

选项

loadImage() 的可选第三个参数是一组选项的映射

  • maxWidth:定义 img/canvas 元素的最大宽度。
  • maxHeight:定义 img/canvas 元素的最大高度。
  • minWidth:定义 img/canvas 元素的最小宽度。
  • minHeight:定义 img/canvas 元素的最小高度。
  • sourceWidth:要绘制到目标画布的源图像子矩形的宽度。
    默认为源图像宽度,需要 canvas: true
  • sourceHeight:要绘制到目标画布的源图像子矩形的高度。
    默认为源图像的高度,并需要 canvas: true
  • top:源图像子矩形的顶部边距。
    默认为 0,并需要 canvas: true
  • right:源图像子矩形的右侧边距。
    默认为 0,并需要 canvas: true
  • bottom:源图像子矩形的底部边距。
    默认为 0,并需要 canvas: true
  • left:源图像子矩形的左侧边距。
    默认为 0,并需要 canvas: true
  • contain:如果设置为 true,则按比例缩放图像以包含最大尺寸。
    这模仿了CSS功能 background-image: contain
  • cover:如果设置为 true,则按比例缩放图像以覆盖最大尺寸。
    这模仿了CSS功能 background-image: cover
  • crop:如果设置为 true,则裁剪图像以符合 maxWidth/maxHeight 约束。
    此功能假定 canvas: true
  • orientation:允许根据EXIF方向规范转换画布坐标。
    此功能假定 canvas: true
  • canvas:如果设置为 true,则返回图像为 canvas 元素。
  • crossOrigin:为加载 CORS启用图像 在 img 元素上设置 crossOrigin 属性。
  • noRevoke:默认情况下,在图像加载后,创建的对象URL会被撤销,除非此选项设置为 true

可以使用以下方式使用它们

loadImage(
    fileOrBlobOrUrl,
    function (img) {
        document.body.appendChild(img);
    },
    {
        maxWidth: 600,
        maxHeight: 300,
        minWidth: 100,
        minHeight: 50,
        canvas: true
    }
);

所有设置都是可选的。默认情况下,图像作为没有任何图像尺寸限制的HTML img 元素返回。

元数据解析

如果包含Load Image Meta扩展,还可以解析图像元数据。
该扩展提供方法 loadImage.parseMetaData,可以使用以下方式使用

loadImage.parseMetaData(
    fileOrBlob,
    function (data) {
        if (!data.imageHead) {
            return;
        }
        // Combine data.imageHead with the image body of a resized file
        // to create scaled images with the original image meta data, e.g.:
        var blob = new Blob([
            data.imageHead,
            // Resized images always have a head size of 20 bytes,
            // including the JPEG marker and a minimal JFIF header:
            loadImage.blobSlice.call(resizedImage, 20)
        ], {type: resizedImage.type});
    },
    {
        maxMetaDataSize: 262144,
        disableImageHead: false
    }
);

第三个参数是一个选项对象,它定义了解析图像元数据的最大字节数,允许禁用imageHead的创建,并传递给通过loadImage扩展注册的段解析器,例如Exif解析器。

注意
可以通过 canvas.toBlob() 创建调整大小后的图像的Blob对象。

Exif解析器

如果包含Load Image Exif Parser扩展,如果给定图像中可以找到Exif数据,则 parseMetaData 回调的 data 包含额外的 exif 属性。
exif 对象存储解析的Exif标签

var orientation = data.exif[0x0112];

它还提供了一个 exif.get() 方法,通过标签的映射名称检索标签值

var orientation = data.exif.get('Orientation');

默认情况下,只有可用的映射名称是 OrientationThumbnail
如果您还包含Load Image Exif Map库,则可以提供额外的标签映射,以及两个额外的方法,exif.getText()exif.getAll()

var flashText = data.exif.getText('Flash'); // e.g.: 'Flash fired, auto mode',

// A map of all parsed tags with their mapped names as keys and their text values:
var allTags = data.exif.getAll();

Exif解析器还为parseMetaData方法提供了额外的选项,以禁用解析器的某些方面

  • disableExif:禁用Exif解析。
  • disableExifThumbnail:禁用解析Exif缩略图。
  • disableExifSub:禁用解析Exif子IFD。
  • disableExifGps:禁用解析Exif GPS Info IFD。

iOS缩放修复

在iOS(iPhone、iPad、iPod)中缩放兆像素图像可能导致图像失真(挤压)。
Load Image iOS缩放修复扩展解决了这些问题。

许可

JavaScript Load Image脚本在 MIT许可 下发布。

致谢

  • 基于Achim Stöhr的帮助和贡献,实现了图像元数据处理。
  • 基于Jacob Seidelin的exif-js实现Exif标签映射。
  • 基于Shinichi Tomita的ios-imagefile-megapixel修复了iOS图像缩放问题。