silvestra/javascript-load-image

安装: 10

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 923

语言:JavaScript

类型:组件

dev-master 2014-09-16 22:03 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:08:05 UTC


README

JavaScript 库,用于加载和转换图像文件。

目录

演示

JavaScript Load Image 演示

描述

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

设置

将(合并和压缩过的)JavaScript Load Image 脚本包含到您的 HTML 标记中

<script src="js/load-image.all.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(例如 'https://example.org/image.png')作为第一个参数。

如果传递了 FileBlob 参数,如果浏览器支持 URL API,则返回一个 HTML img 元素,如果支持 FileReader 对象,则返回一个 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 = "https://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 中。
    默认为源图像宽度,需要 canvas: true
  • sourceHeight:源图像的子矩形高度,用于绘制到目标 canvas 中。
    默认为源图像高度,并需要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
  • aspectRatio:将图像裁剪到给定的宽高比(例如,16/9)。
    此功能假定crop: true
  • crop:如果设置为true,则将图像裁剪到maxWidth/maxHeight约束。
    此功能假定canvas: true
  • orientation:允许根据EXIF方向规范转换画布坐标。
    此功能假定canvas: true
  • canvas:如果设置为true,则返回作为canvas元素的图像。
  • crossOrigin:为img元素设置crossOrigin属性以加载CORS启用图像
  • 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扩展,则parseMetaData回调的数据包含额外的属性exif,如果可以在给定图像中找到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 Sub IFD的解析。
  • disableExifGps:禁用Exif GPS Info IFD的解析。

iOS 缩放修复

在iOS(iPhone、iPad、iPod)上缩放兆像素图像可能会导致图像扭曲(挤压)。
加载图片iOS缩放修复扩展解决了这些问题。

许可证

JavaScript 加载图片脚本在 MIT 许可证 下发布。

鸣谢

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