У меня возникли проблемы с применением фильтров HALD во Flutter. Я не эксперт в этой области, поэтому, возможно, мне просто потребуется изменить некоторые параметры или настройки.
Я пытался использовать библиотеку flutter_image_filters и свои собственные скрипты. Ниже приведен пример того, что я пробовал:
У меня возникли проблемы с применением фильтров HALD во Flutter. Я не эксперт в этой области, поэтому, возможно, мне просто потребуется изменить некоторые параметры или настройки. Я пытался использовать библиотеку flutter_image_filters и свои собственные скрипты. Ниже приведен пример того, что я пробовал: [code]import 'dart:async'; import 'dart:typed_data'; import 'dart:ui' as ui;
class HaldFiltersUtils { static Future createCubeData(String lutName) async { final ByteData assetData = await rootBundle.load(lutName); final Completer completer = Completer(); ui.decodeImageFromList(Uint8List.view(assetData.buffer), (ui.Image img) { completer.complete(img); }); final ui.Image lutImage = await completer.future;
const int dimension = 64; const int pixels = dimension * dimension * dimension; const int channels = 4; const int memSize = pixels * channels;
final ByteData? inBitmapData = await lutImage.toByteData(format: ui.ImageByteFormat.rawRgba);
if (inBitmapData == null) { throw Exception('Failed to read image data'); }
final Uint8List inBuffer = inBitmapData.buffer.asUint8List();
final Float32List finalBuffer = Float32List(memSize);
for (int i = 0; i < memSize; i++) { finalBuffer[i] = inBuffer[i] / 255.0; }
return finalBuffer.buffer.asByteData(); }
static Future applyLutToImage(PickedImage pickedImage, ByteData lutData, double intensity, [bool isThumbnail = false]) async { final int newHeight = isThumbnail ? pickedImage.thumbnailHeight : pickedImage.height; final int newWidth = isThumbnail ? pickedImage.thumbnailWidth : pickedImage.width;
final int numPixels = newHeight * newWidth; const int channels = 4; const int dimension = 64; final ByteData byteData = isThumbnail ? pickedImage.thumbnailByteData : pickedImage.byteData;
final Uint8List inBuffer = byteData.buffer.asUint8List(); final Float32List lutBuffer = lutData.buffer.asFloat32List();
final Uint8List resultData = Uint8List(numPixels * channels);
for (int i = 0; i < numPixels * channels; i += 4) { final int r = inBuffer[i]; final int g = inBuffer[i + 1]; final int b = inBuffer[i + 2]; final int a = inBuffer[i + 3];