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.

48 lines
1.4 KiB

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