首页 > 其他分享 >Flutter OHOS flutter_image_crop(图片裁剪)

Flutter OHOS flutter_image_crop(图片裁剪)

时间:2024-12-26 17:35:07浏览次数:4  
标签:裁剪 image await crop options let 图像 Flutter

Flutter 的图片裁剪插件

该插件附带一个Crop小部件。该小部件仅渲染图像、叠加层和用于裁剪图像的句柄。因此,它可以与其他小部件组合以构建自定义图像裁剪体验。

使用

  1. 创建一个小部件来加载和编辑图像:
final cropKey = GlobalKey<CropState>();

Widget _buildCropImage() {
  return Container(
  color: Colors.black,
  padding: const EdgeInsets.all(20.0),
  child: Crop(
key: cropKey,
image: Image.file(imageFile),
aspectRatio: 4.0 / 3.0,
  ),
  );
}
  1. 访问裁剪值:
  • 比例是裁剪时按比例缩放图像宽度和高度的一个因素。1.0不需要比例。
  • 区域是一个矩形,表示图像上要裁剪的分数位置。
final crop = cropKey.currentState;
// or
// final crop = Crop.of(context);
final scale = crop.scale;
final area = crop.area;

if (area == null) {
// cannot crop, widget is not setup
// ...
}
  1. 访问和处理图像。作为请求访问照片权限的便捷功能。

    final permissionsGranted = await ImageCrop.requestPermissions();

  2. 读取图像选项,例如:宽度和高度。这是一种高效的实现,无需解码或将实际图像加载到内存中。

	final options = await getImageOptions(file: file);
debugPrint('image width: ${options.width}, height: ${options.height}');
  1. 如果要将大图像加载到内存中,则有一个采样函数依赖于本机平台按比例缩小图像,然后再将其加载到内存中。例如,重新采样图像以1024x4096尽可能接近尺寸。如果它是正方形,preferredSize则可以使用它来指定宽度和高度。在 UI 中显示图像时最好利用此功能。
	final sampleFile = await ImageCrop.sampleImage(
file: originalFile,
preferredWidth: 1024,
preferredHeight: 4096,
);
  1. 一旦Crop小部件准备就绪,就会提供对图像的裁剪和缩放的原生支持。为了生成更高质量的裁剪图像,请依靠具有首选最大宽度和高度的采样图像。放大采样图像的分辨率。裁剪后,图像的分辨率更高。示例如下:
	final sampledFile = await ImageCrop.sampleImage(
file: originalFile,
preferredWidth: (1024 / crop.scale).round(),
preferredHeight: (4096 / crop.scale).round(),
);

final croppedFile = await ImageCrop.cropImage(
file: sampledFile,
area: crop.area,
);

鸿蒙OS关键代码

裁剪方法

 private async cropImage(result: MethodResult, path: string, scale: number, left: number, top: number, right: number, bottom: number) {
let imageSource = image.createImageSource(path);
let pixelMapData = await imageSource.createPixelMap();
let options = await this.decodeImageOptions(imageSource);
if (options.isFlippedDimensions()) {
  await pixelMapData.rotate(options.getDegrees());
}

let width = options.getWidth() * (right - left) * scale;
let height = options.getHeight() * (bottom - top) * scale;
let region: image.Region = {
  x: options.getWidth() * left, y: options.getHeight() * top, size: {
height: height, width: width
  }
};
await pixelMapData.crop(region);
let dstFile = this.createTemporaryImageFilePath();
await this.savaPixelMap(pixelMapData, dstFile);
await imageSource.release();
result.success(dstFile);
  }

缩略图采样

  private async sampleImage(result: MethodResult, path: string, maximumWidth: number, maximumHeight: number) {
let imageSource = image.createImageSource(path);
let options = await this.decodeImageOptions(imageSource);
// 缩略图采样大小,当前只能取1。
let inSampleSize = 1;//this.calculateInSampleSize(options.getWidth(), options.getHeight(), maximumWidth, maximumHeight);
let pixelMapData = await imageSource.createPixelMap({sampleSize: inSampleSize});
if (options.getWidth() > maximumWidth && options.getHeight() > maximumHeight) {
  let ratio = Math.max(maximumWidth / options.getWidth(), maximumHeight / options.getHeight());
  await pixelMapData.scale(ratio, ratio);
}
let dstFile = this.createTemporaryImageFilePath();
await this.savaPixelMap(pixelMapData, dstFile);
await imageSource.release()
// await this.copyExif(path, dstFile); //此方法OHOS接口暂时支持有问题 等新版本在验证
result.success(dstFile);
  }

获取图片属性

  private async getImageOptions(path: string, result: MethodResult) {
let source = image.createImageSource(path);
let options = await this.decodeImageOptions(source);
let properties = new HashMap<string, number>();
properties.set("width", options.getWidth());
properties.set("height", options.getHeight());
await source.release();
result.success(properties);
  }

标签:裁剪,image,await,crop,options,let,图像,Flutter
From: https://www.cnblogs.com/cnblogxj/p/18633729

相关文章

  • Flutter进阶组件(1):RadioListTiles(单选列表项)
    RadioListTile是一个特殊的ListTile,它内嵌了一个单选按钮(Radio),包含更多信息的单选项,提供多种配置信息的属性,可以表现更丰富的信息。这使得它非常适合用来创建单选列表项,常用于让用户在多个选项中选择一个的场景。一、属性RadioListTile组件提供了以下属性,以支持各种自定义需求:......
  • Flutter进阶组件(3):SwitchListTile(开关列表项)
    SwitchListTile是一个包含开关(Switch)的列表项,非常适合用来创建带有标题、副标题以及开关的列表项,常用于设置界面,让用户可以轻松地开启或关闭某个功能。一、基本使用SwitchListTile(title:constText('EnableNotifications'),value:true,//开关的初始状态onChanged......
  • Flutter进阶组件(2):CheckboxListTile(复选框列表项)
    CheckboxListTile是一个特殊的ListTile,它内嵌了一个复选框(Checkbox)。这使得它非常适合用来创建一个带有标题和可选复选框的列表项,常用于设置界面或需要用户选择多个选项的场景。一、属性CheckboxListTile组件提供了以下属性,以支持各种自定义需求:title:显示的标题,通常是一个Te......
  • Flutter学习笔记:pubspec.yaml
    本文更新于2024-12-15,使用Flutter3.3.3。目录项目结构pubspec.yaml外部依赖库项目结构android/:Android原生目录。app/build.gradlesrc/main/AndroidMainfest.xml:Android重要配置。res/drawable/launch_background.xml:启动页配置。midmap-hdpi/ic_lancher.......
  • harmony_flutter video_trimmer实现视频剪辑
    harmony_fluttervideo_trimmer实现视频剪辑简介videotrimmer是在OpenHarmony环境下,提供视频剪辑能力的三方库安装教程ohpminstall@ohos/videotrimmerOpenHarmonyohpm环境配置等更多内容,请参考如何安装OpenHarmonyohpm包。使用介绍构建VideoTrimmerOption对象:ge......
  • harmony_flutter mvvm架构思想
    harmony_fluttermvvm架构思想写在前面在Flutter中实现MVVM(Model-View-ViewModel)架构是为了将UI(视图)与业务逻辑(模型和视图模型)分离,提高代码的可维护性和可读性。整体架构概述Model:数据层,处理应用程序的业务逻辑和数据管理。View:用户界面层,负责展示数据并接受用户输入。V......
  • Flutter OHOS fluttertpc_app_installer(打开应用商店和安装APP)
    fluttertpc_app_installer打开应用商店和安装APP用法StringandroidAppId='';StringiOSAppId='';StringohosAppId='';AppInstaller.goStore(androidAppId,iOSAppId,ohosAppId); AppInstaller.installApk('/sdcard/apk/app-debug.......
  • Flutter OHOS flutter_keychain(字符串安全存储)
    flutter_keychain一个支持通过Keychain和Keystore支持字符串安全存储的Flutter插件如果您有其他类型想要存储,则需要序列化为UTF-8字符串。使用import'package:flutter_keychain/flutter_keychain.dart';...//Getvaluevarvalue=awaitFlutterKeychain.get(ke......
  • WPF TileMode ViewPort ImageBrush VisualBrush
    <Windowx:Class="WpfApp98.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.......
  • Flutter学习笔记:开发环境搭建
    本文更新于2024-12-15,使用Flutter3.3.3,操作系统为Windows10。安装Flutter下载Flutter。官网下载页面为:https://docs.flutter.dev/get-started/install/windows。本文使用的版本的下载地址为:https://storage.googleapis.com/flutter_infra_release/releases/stable/windows/......