Flutter - Android: проблемы с пикселизацией при применении LUTAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Flutter - Android: проблемы с пикселизацией при применении LUT

Сообщение Anonymous »

У меня возникли проблемы с применением фильтров HALD во Flutter. Я не эксперт в этой области, поэтому, возможно, мне просто потребуется изменить некоторые параметры или настройки.
Я пытался использовать библиотеку 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»