I'm using flutter as a module for my native app - Swift for iOS and Kotlin for Android. I'm trying to create and rotate an image using canvas.
On Android it works perfectly but on iOS it just returns a blank image. I've also tested by creating a brand new flutter app and built on an iOS device, it also works fine.
I am following Platform integration to integrate Flutter into my native Swift project
void getImage() {
ui.Image image = await getNetworkImage(imageURL);
ui.Image rotatedImage = await rotatedImage(image: image, angle: -pi / 2);
ByteData? byteData = await rotatedImage.toByteData(format: ui.ImageByteFormat.png);
Uint8List? intList = byteData?.buffer.asUint8List();
// Use this to show the rotated image on a widget
}
Future<ui.Image> getNetworkImage(String path) async {
var completer = Completer<ImageInfo>();
var img = new NetworkImage(path);
img.resolve(const ImageConfiguration()).addListener(ImageStreamListener((info, _) {
completer.complete(info);
}));
ImageInfo imageInfo = await completer.future;
return imageInfo.image;
}
Future<ui.Image> rotatedImage({required ui.Image image, required double angle}) async {
var pictureRecorder = ui.PictureRecorder();
Canvas canvas = Canvas(pictureRecorder);
final double r = sqrt(image.width * image.height + image.height * image.width) / 2;
final alpha = atan(image.width / image.height);
final beta = alpha + angle;
final shiftY = r * sin(beta);
final shiftX = r * cos(beta);
final translateX = image.width / 2 - shiftX;
final translateY = image.height / 2 - shiftY;
canvas.translate(translateX, translateY);
canvas.rotate(angle);
canvas.drawImage(image, Offset.zero, Paint());
final result = await pictureRecorder.endRecording().toImage(image.width, image.height);
return result;
}