You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.6 KiB

2 years ago
  1. import 'dart:developer';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:image/image.dart' as image_lib;
  5. import 'package:palette_generator/palette_generator.dart';
  6. import 'package:tuple/tuple.dart';
  7. class ImageSplitter {
  8. List<Image> splitImage(Map<String, dynamic> mapData) {
  9. List<int> input = mapData['input'];
  10. int size = mapData['size'];
  11. // convert image to image from image package
  12. image_lib.Image image = image_lib.decodeImage(input)!;
  13. int x = 0, y = 0;
  14. int width = (image.width / size).round();
  15. int height = (image.height / size).round();
  16. // split image to parts
  17. List<image_lib.Image> parts = [];
  18. for (int i = 0; i < size; i++) {
  19. for (int j = 0; j < size; j++) {
  20. parts.add(image_lib.copyCrop(image, x, y, width, height));
  21. x += width;
  22. }
  23. x = 0;
  24. y += height;
  25. }
  26. // convert image from image package to Image Widget to display
  27. List<Image> output = [];
  28. for (var img in parts) {
  29. output.add(Image.memory(Uint8List.fromList(image_lib.encodeJpg(img))));
  30. }
  31. return output;
  32. }
  33. Future<PaletteGenerator> getImagePalette(ImageProvider imageProvider) async {
  34. final paletteGenerator = await PaletteGenerator.fromImageProvider(imageProvider);
  35. return paletteGenerator;
  36. }
  37. Future<List<Image>> runSplitterIsolate(List<int> input, int size) async {
  38. final Map<String, dynamic> data = {
  39. 'input': input,
  40. 'size': size,
  41. };
  42. List<Image> splitImages = await compute(splitImage, data);
  43. return splitImages;
  44. }
  45. }