processor.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import 'dart:typed_data';
  2. class Test {
  3. void run() {
  4. final processor = BrightnessProcessor();
  5. processor.propertyChanged.add(onPropertyChanged);
  6. processor.brightness++;
  7. processor.propertyChanged.remove(onPropertyChanged);
  8. processor.brightness++;
  9. }
  10. onPropertyChanged(Object sender, void e) {
  11. //
  12. print('onPropertyChanged');
  13. }
  14. }
  15. abstract class IImageProcessor {
  16. // final propertyChanged = FEventHandler<int>();
  17. late final FEventHandler<void> propertyChanged;
  18. bool get changed;
  19. Uint8List process(Uint8List pixelDatas);
  20. void reset();
  21. }
  22. class BrightnessProcessor implements IImageProcessor {
  23. int _brightness = 0;
  24. int get brightness => _brightness;
  25. set brightness(int value) {
  26. if (_brightness != value) {
  27. _brightness = value;
  28. // OnBrightnessChanged();
  29. onPropertyChanged();
  30. }
  31. }
  32. @override
  33. bool get changed => _brightness != 0;
  34. @override
  35. Uint8List process(Uint8List pixelDatas) {
  36. if (brightness == 0) {
  37. return pixelDatas;
  38. }
  39. int bVal = brightness;
  40. if (bVal < -255) bVal = -255;
  41. if (bVal > 255) bVal = 255;
  42. for (int i = 0; i < pixelDatas.length - 1; i += 4) {
  43. int b = pixelDatas[i];
  44. int g = pixelDatas[i + 1];
  45. int r = pixelDatas[i + 2];
  46. b += bVal;
  47. g += bVal;
  48. r += bVal;
  49. if (b < 0) b = 0;
  50. if (b > 255) b = 255;
  51. if (g < 0) g = 0;
  52. if (g > 255) g = 255;
  53. if (r < 0) r = 0;
  54. if (r > 255) r = 255;
  55. pixelDatas[i] = b;
  56. pixelDatas[i + 1] = g;
  57. pixelDatas[i + 2] = r;
  58. }
  59. // for (int i = 0; i < pixelDatas.length - 1; i++) {
  60. // int pixel = pixelDatas[i];
  61. // List<int> pixelBytes = intToBytes(pixel);
  62. // int b = pixelBytes[0];
  63. // int g = pixelBytes[1];
  64. // int r = pixelBytes[2];
  65. // b += bVal;
  66. // g += bVal;
  67. // r += bVal;
  68. // if (b < 0) b = 0;
  69. // if (b > 255) b = 255;
  70. // if (g < 0) g = 0;
  71. // if (g > 255) g = 255;
  72. // if (r < 0) r = 0;
  73. // if (r > 255) r = 255;
  74. // pixelBytes[0] = b;
  75. // pixelBytes[1] = g;
  76. // pixelBytes[2] = r;
  77. // ByteData data = ByteData.view(Uint8List.fromList(pixelBytes).buffer);
  78. // final rst = data.getInt32(0, Endian.host);
  79. // // final rst = bytesToInt(pixelBytes);
  80. // pixelDatas[i] = rst;
  81. // }
  82. return pixelDatas;
  83. }
  84. static List<int> intToBytes(int i) {
  85. final bytes = List<int>.filled(4, 0, growable: false);
  86. bytes[0] = i & 0xff;
  87. bytes[1] = (i >> 8) & 0xff;
  88. bytes[2] = (i >> 16) & 0xff;
  89. bytes[3] = (i >> 24) & 0xff;
  90. return bytes;
  91. }
  92. static int bytesToInt(List<int> bytes, [int offset = 0]) {
  93. int value;
  94. value = (bytes[offset] & 0xff) |
  95. ((bytes[offset + 1] & 0xff) << 8) |
  96. ((bytes[offset + 2] & 0xff) << 16) |
  97. ((bytes[offset + 3] & 0xff) << 24);
  98. return value;
  99. }
  100. @override
  101. void reset() {
  102. print('reset');
  103. }
  104. @override
  105. FEventHandler<void> propertyChanged = FEventHandler<void>();
  106. void onPropertyChanged() {
  107. propertyChanged.emit(this, null);
  108. }
  109. }
  110. typedef FEventCallback<T> = void Function(
  111. Object sender,
  112. T e,
  113. );
  114. class FEventHandler<T> {
  115. List<FEventCallback<T>>? _callbacks;
  116. void emit(Object sender, T e) {
  117. if (_callbacks != null && _callbacks!.isNotEmpty) {
  118. for (final callback in _callbacks!) {
  119. callback.call(sender, e);
  120. }
  121. }
  122. }
  123. void add(FEventCallback<T> callback) {
  124. _callbacks ??= [];
  125. _callbacks!.add(callback);
  126. }
  127. void remove(FEventCallback<T> callback) {
  128. if (_callbacks == null) return;
  129. if (_callbacks!.contains(callback)) {
  130. _callbacks!.remove(callback);
  131. }
  132. }
  133. }