brendan-duncan / image

Dart Image Library for opening, manipulating, and saving various different image file formats.
MIT License
1.17k stars 264 forks source link

DartError: ImageException: PVRTC requires a square image. #685

Closed ajee10x closed 5 days ago

ajee10x commented 5 days ago

PS C:\Users*******> flutter run -d chrome Launching lib\main.dart on Chrome in debug mode... Waiting for connection from debug service on Chrome... 10.6s This app is linked to the debug service: ws://127.0.0.1:53457/HutKGoE1XyA=/ws Debug service listening on ws://127.0.0.1:53457/HutKGoE1XyA=/ws

🔥 To hot restart changes while running, press "r" or "R". For a more detailed help message, press "h". To quit, press "q".

A Dart VM Service on Chrome is available at: http://127.0.0.1:53457/HutKGoE1XyA= The Flutter DevTools debugger and profiler on Chrome is available at: http://127.0.0.1:53462?uri=http://127.0.0.1:53457/HutKGoE1XyA= DartError: ImageException: PVRTC requires a square image. dart-sdk/lib/_internal/js_dev_runtime/private/ddcruntime/errors.dart 296:3 throw packages/image/src/formats/pvr_encoder.dart 192:7 encodeRgba4bpp packages/image/src/formats/pvr_encoder.dart 34:19 encode packages/image/src/formats/formats.dart 614:18 encodePvr packages/anyfilex/core/file_converters/image_converter.dart 47:47 convertImageForWeb dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54 runBody dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5 _async packages//core/file_converters/image_converter.dart 8:40 convertImageForWeb packages//features/image_conversion/logic/image_conversion_web_logic.dart 33:22 convertImage dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54 runBody dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5 _async packages//features/image_conversion/logic/image_conversion_web_logic.dart 31:41 convertImage packages//features/image_conversion/ui/image_conversion_web_screen.dart 112:53 dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54 runBody dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5 _async packages/***/features/image_conversion/ui/image_conversion_web_screen.dart 105:21 packages/flutter/src/material/ink_well.dart 1170:21 handleTap packages/flutter/src/gestures/recognizer.dart 351:24 invokeCallback packages/flutter/src/gestures/tap.dart 656:11 handleTapUp packages/flutter/src/gestures/tap.dart 313:5 [_checkUp] packages/flutter/src/gestures/tap.dart 246:7 handlePrimaryPointer packages/flutter/src/gestures/recognizer.dart 703:9 handleEvent packages/flutter/src/gestures/pointer_router.dart 98:7 [_dispatch] packages/flutter/src/gestures/pointer_router.dart 143:9 dart-sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart 21:7 forEach packages/flutter/src/gestures/pointer_router.dart 141:17 [_dispatchEventToRoutes] packages/flutter/src/gestures/pointer_router.dart 127:7 route packages/flutter/src/gestures/binding.dart 501:5 handleEvent packages/flutter/src/gestures/binding.dart 481:14 dispatchEvent packages/flutter/src/rendering/binding.dart 450:11 dispatchEvent packages/flutter/src/gestures/binding.dart 426:7 [_handlePointerEventImmediately] packages/flutter/src/gestures/binding.dart 389:5 handlePointerEvent packages/flutter/src/gestures/binding.dart 336:7 [_flushPointerEventQueue] packages/flutter/src/gestures/binding.dart 305:9 [_handlePointerDataPacket] lib/_engine/engine/platform_dispatcher.dart 1423:5 invoke1 lib/_engine/engine/platform_dispatcher.dart 336:5 invokeOnPointerDataPacket lib/_engine/engine/pointer_binding.dart 405:30 [_sendToFramework] lib/_engine/engine/pointer_binding.dart 225:7 onPointerData lib/_engine/engine/pointer_binding.dart 1035:20 lib/_engine/engine/pointer_binding.dart 948:7 lib/_engine/engine/pointer_binding.dart 541:9 loggedHandler dart-sdk/lib/_internal/js_dev_runtime/patch/js_allow_interop_patch.dart 188:27 _callDartFunctionFast1

ajee10x commented 5 days ago

Solution that worked for me:

    // Handle special resizing for PVRTC format (must be a square image and power-of-two size)
    if (targetFormat.toLowerCase() == 'pvr') {
      int size = _getNearestPowerOfTwo(
          image.width < image.height ? image.width : image.height);
      final resizedImage = img.copyResize(image, width: size, height: size);
      return Uint8List.fromList(img.encodePvr(resizedImage));
    }

  // Helper function to get the nearest power of two
  int _getNearestPowerOfTwo(int value) {
    return (value & (value - 1)) == 0
        ? value
        : 1 << (value.bitLength); // Return the next power of two
  }