Я пытался использовать библиотеку flutter_image_filters и свои собственные скрипты. Ниже приведен пример того, что я пробовал:
Код: Выделить всё
import 'dart:async';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:epishi_android/domain/entities/picked_image.dart';
import 'package:flutter/services.dart';
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];
final int lutIndex = (b ~/ (256 / dimension)) * dimension * dimension +
(g ~/ (256 / dimension)) * dimension +
(r ~/ (256 / dimension));
final int lutR = (lutBuffer[lutIndex * channels] * 255).toInt().clamp(0, 255);
final int lutG = (lutBuffer[lutIndex * channels + 1] * 255).toInt().clamp(0, 255);
final int lutB = (lutBuffer[lutIndex * channels + 2] * 255).toInt().clamp(0, 255);
resultData[i] = ((r * (1.0 - intensity)) + (lutR * intensity)).toInt().clamp(0, 255);
resultData[i + 1] = ((g * (1.0 - intensity)) + (lutG * intensity)).toInt().clamp(0, 255);
resultData[i + 2] = ((b * (1.0 - intensity)) + (lutB * intensity)).toInt().clamp(0, 255);
resultData[i + 3] = a; // Alpha channel remains the same
}
final ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromUint8List(resultData);
final ui.ImageDescriptor descriptor =
ui.ImageDescriptor.raw(buffer, width: newWidth, height: newHeight, pixelFormat: ui.PixelFormat.rgba8888);
final ui.Codec codec = await descriptor.instantiateCodec();
final ui.FrameInfo frameInfo = await codec.getNextFrame();
return frameInfo.image;
}
}
Я пытался использовать библиотеку flutter_image_filters и свои собственные скрипты
Подробнее здесь: https://stackoverflow.com/questions/787 ... plying-lut