Flutter图像LUT处理插件easy_lut的使用

Flutter图像LUT处理插件easy_lut的使用

特性

  • 解析1D LUT文件

    • 使用TITLE行获取标题(默认为文件名)
  • 解析3D LUT文件

    • 使用TITLE行获取标题(默认为文件名)
    • 支持3列和6列格式
  • 解析LUT“图片”

    • 仅支持png格式
  • 使用image包对图像应用LUT

使用方法

目标是使应用LUT变得简单。因此,你只需要使用大约两个方法。

import 'package:easy_lut/easy_lut.dart';

void main() async {
  final easyLUT = EasyLUT();
  
  final lut = await easyLUT.parseLUTWithPath('path_of_your_lut.cube');
  final filteredImageData = await easyLUT.applyLUTonPath(lut, 'your_image_path');
  
  print('${lut.title} lut applied on image');
}

可用方法

一个EasyLUT对象具有以下公共方法。

/// 使用文件路径解析LUT数据
Future<LUT> parseLUTWithPath(String path)

/// 使用文件解析LUT数据
Future<LUT> parseLUTWithFile(File file)

/// 在imageData上应用LUT数据并返回结果imageData
Uint8List? applyLUT(LUT lut, Uint8List imageData)

/// 在文件上应用LUT数据
/// 原始文件不会更改
/// 返回结果imageData
Future<Uint8List?> applyLUTonFile(LUT lut, File file)

/// 在文件路径上应用LUT数据
/// 原始文件不会更改
/// 返回结果imageData
Future<Uint8List?> applyLUTonPath(LUT lut, String path)

/// 将3D LUT转换为图像
Uint8List convertLUTtoBMP(ThreeDimensionLUT lut)

示例代码

以下是使用easy_lut插件的一个完整示例:

import 'dart:io';

import 'package:easy_lut/easy_lut.dart';

void main() async {
  // 读取原始图像数据
  final imageData = await File('card_1.png').readAsBytes();

  // 定义LUT文件路径列表
  final lutPaths = [
    'InverseLUT',
    '1DummyLUT',
    'LBK-K-Tone_33.cube',
  ];

  // 创建EasyLUT实例
  final easyLUT = EasyLUT();

  // 遍历LUT文件路径
  for (var path in lutPaths) {
    LUT lut;

    try {
      // 解析LUT文件
      lut = await easyLUT.parseLUTWithPath(path);
    } catch (err) {
      // 如果解析失败,打印错误信息并跳过当前LUT文件
      print('ERROR: Skipped $path\n$err');
      continue;
    }

    // 获取LUT的标题,并替换特殊字符
    final fileName = lut.title
        .replaceAll(' ', '_')
        .replaceAll('"', '')
        .replaceAll('(', '')
        .replaceAll(')', '')
        .replaceAll('-', '_');

    // 如果LUT是三维的,将其转换为图像并保存
    if (lut is ThreeDimensionLUT) {
      final lutBMP = easyLUT.convertLUTtoBMP(lut);
      await File('${fileName}_lut.bmp').writeAsBytes(lutBMP);
    }

    // 应用LUT到原始图像数据
    final newImageData = easyLUT.applyLUT(lut, imageData);

    // 如果新图像数据不为空,则保存新的图像文件
    if (newImageData != null) {
      await File('$fileName.png').writeAsBytes(newImageData);
    }
  }
}

更多关于Flutter图像LUT处理插件easy_lut的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图像LUT处理插件easy_lut的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用easy_lut插件进行图像LUT(查找表)处理的示例代码。easy_lut插件允许你应用LUT滤镜到图像上,从而实现图像色彩校正和风格化效果。

首先,确保你已经在pubspec.yaml文件中添加了easy_lut依赖:

dependencies:
  flutter:
    sdk: flutter
  easy_lut: ^最新版本号  # 请替换为实际发布的最新版本号

然后,运行flutter pub get来安装依赖。

以下是一个完整的Flutter应用示例,展示了如何使用easy_lut插件:

import 'package:flutter/material.dart';
import 'package:easy_lut/easy_lut.dart';
import 'dart:ui' as ui;
import 'dart:typed_data';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LutScreen(),
    );
  }
}

class LutScreen extends StatefulWidget {
  @override
  _LutScreenState createState() => _LutScreenState();
}

class _LutScreenState extends State<LutScreen> {
  Uint8List? lutImageBytes;
  ui.Image? originalImage;
  ui.Image? lutProcessedImage;

  @override
  void initState() {
    super.initState();
    loadAssets();
  }

  Future<void> loadAssets() async {
    // 加载LUT文件(假设LUT文件已放在assets文件夹下)
    lutImageBytes = await rootBundle.load('assets/lut.cube');

    // 加载原始图像(假设图像文件已放在assets文件夹下)
    ByteData imageData = await rootBundle.load('assets/image.png');
    List<int> imageBytes = imageData.buffer.asUint8List();
    originalImage = await decodeImageFromList(imageBytes);

    if (originalImage != null && lutImageBytes != null) {
      applyLutFilter();
    }
  }

  Future<void> applyLutFilter() async {
    EasyLut easyLut = EasyLut(lutData: lutImageBytes!);
    lutProcessedImage = await easyLut.applyLut(originalImage!);
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('LUT Filter Example'),
      ),
      body: Center(
        child: lutProcessedImage != null
            ? Image.memory(
                encodeImage(lutProcessedImage!),
                fit: BoxFit.cover,
              )
            : originalImage != null
                ? Image.memory(
                    encodeImage(originalImage!),
                    fit: BoxFit.cover,
                  )
                : CircularProgressIndicator(),
      ),
    );
  }
}

注意事项:

  1. LUT 文件:确保你的LUT文件(如.cube文件)已经放在assets文件夹中,并在pubspec.yaml中声明:

    flutter:
      assets:
        - assets/lut.cube
        - assets/image.png
    
  2. 图像文件:同样,确保你的图像文件(如PNG文件)已经放在assets文件夹中,并在pubspec.yaml中声明。

  3. 权限:如果你的LUT文件或图像文件是从网络或其他外部源加载的,确保你有适当的权限和网络访问配置。

  4. 错误处理:在实际应用中,添加错误处理逻辑以处理可能的加载失败或解码错误。

这个示例展示了如何加载LUT文件和原始图像,并将LUT滤镜应用到图像上。在applyLutFilter方法中,EasyLut类被用来处理LUT滤镜,并将结果存储在lutProcessedImage中,然后在UI中显示处理后的图像。

回到顶部