html 图像怎么编码,如何对新图像进行编码 (HTML)

如何对新图像进行编码 (HTML)

02/12/2016

本文内容

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

我们向你展示如何使用 BitmapEncoder 对象将新图像保存到文件中。如果你希望更改现有图像,请参阅如何编辑图像。

你需要了解的内容

技术

先决条件

我们假设你能够创建使用 JavaScript 的基本 Windows 运行时应用。有关详细信息,请参阅构建你的第一个使用 JavaScript 的 Windows 运行时应用。

说明

步骤 1: 使用文件选取器来选取目标文件

使用 FileSavePicker,用户可以从其系统中选取一个新文件或现有文件。在通过选取器获取文件后,可以将该文件用作 BitmapEncoder 的目标文件。

首先,创建新的文件选取器对象、设置文件类型选项以允许 JPEG 图像,并向用户显示选取器。

// variables to store objects across multiple async operations

var encoder;

var fileType;

var stream;

var picker = new Windows.Storage.Pickers.FileSavePicker();

picker.fileTypeChoices.insert("JPEG file", [".jpg"]);

picker.defaultFileExtension = "jpg";

picker.suggestedFileName = "untitled";

picker.pickSaveFileAsync().then(function (file) {

if (!file) {

// The user did not select a file.

return;

}

fileType = file. fileType;

注意  你可以向文件类型筛选器中添加更多扩展名。有关详细信息,请参阅 Windows.Storage.Pickers。

步骤 2: 创建新图像的编码器对象

在具有目标文件时,从文件中获取具有 ReadWrite 访问权限的 IRandomAccessStream,将其用于实例化 BitmapEncoder。你还需要确定用户所选的文件类型的正确编码器 ID。此示例仅允许 JPEG 图像,因此如果你允许多种文件类型,则需要根据文件的 FileType 参数进行切换。

return file.openAsync(Windows.Storage.FileAccessMode.readWrite);

}).then(function (_stream) {

stream = _stream;

stream.size = 0;

var encoderId;

switch (fileType) {

case ".jpg":

encoderId = Windows.Graphics.Imaging.BitmapEncoder.jpegEncoderId;

break;

}

return Windows.Graphics.Imaging.BitmapEncoder.createAsync(encoderId, stream);

}).then(function (encoder) {

注意  内置编码器 ID 用作 BitmapEncoder 的静态成员。

现在,你已经具有表示空白 JPEG 图像的 BitmapEncoder 了。

步骤 3: 设置编码器上的某些数据

由于你已经拥有 BitmapEncoder 对象,因此可以设置元数据和像素数据,并可以控制缩略图和转换(例如,旋转和缩放)。

此处代码设置一个简单像素数据数组。有关设置图像属性和元数据的详细信息,请参阅如何写入图像元数据。

// An array representing 2x2 red, opaque pixel data

var pixels = [255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255];

encoder.setPixelData(

Windows.Graphics.Imaging.BitmapPixelFormat.rgba8,

Windows.Graphics.Imaging.BitmapAlphaMode.straight,

2, // pixel width

2, // pixel height

96, // horizontal DPI

96, // vertical DPI

pixels

);

注意  如果使用 CreateAsync 方法创建 BitmapEncoder,则为创建有效图像而必须提供的最少信息为使用 SetPixelData 方法的像素数据。

步骤 4: 保存对文件的更改

在执行编辑 BitmapEncoder 时,在使用该文件前必须刷新编码器并关闭基本流。如果不这么做,则不会保存图像并将丢失数据。

最后,处理所有错误。如果尝试执行文件格式不支持的或者无效的编码操作,则在调用 FlushAsync 前不会遇到错误。即,如果尝试采用某种格式(例如,不支持缩略图的 BMP 格式)通过将 IsThumbnailGenerated 设置为 True 来保存缩略图,则会导致 FlushAsync 失败。

return encoder.flushAsync();

}).then(function () {

// This means the encoder saved successfully.

}, function (error) {

// There was an error encoding, error.message has the error string.

}).done(null, function () {

// Close the stream regardless of whether encoding was successful. Otherwise it will continue to be locked for Read/Write access.

stream && stream.close();

});

}

注意  调用 FlushAsync 函数时,编码器保存,因此必须重新创建编码器才能执行更多操作。如果你打算稍后使用编码器,则只有在编码器使用完成后才可调用 FlushAsync。

相关主题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值