Flutter - 如何使用 Canvas 围绕中心旋转图像?
Flutter - How to rotate an image around the center with Canvas?
我正在尝试从中心旋转 ui.Image。我可以旋转图像,但图像没有旋转到准确的角度。我添加了下面的图片...
当我通过 0 作为工作线的角度时。
现在当我超过 90 度时你就可以解决问题了。小车转了90多
现在当我通过 180 度作为角度时,您就可以解决问题了。车转了180多
这是我的代码:
Future<ui.Image> getUiImage(String assetImageName, double angle) async {
final ByteData assetImageByteData = await rootBundle.load(imageAssetPath);
image.Image baseSizeImage =
image.decodeImage(assetImageByteData.buffer.asUint8List());
ui.Codec codec =
await ui.instantiateImageCodec(image.encodePng(baseSizeImage));
ui.FrameInfo frameInfo = await codec.getNextFrame();
var pictureRecorder = ui.PictureRecorder();
Canvas canvas = Canvas(pictureRecorder);
final double r = sqrt(frameInfo.image.width * frameInfo.image.width +
frameInfo.image.height * frameInfo.image.height) /
2;
final alpha = atan(frameInfo.image.height / frameInfo.image.width);
final beta = alpha + angle;
final shiftY = r * sin(beta);
final shiftX = r * cos(beta);
final translateX = frameInfo.image.width / 2 - shiftX;
final translateY = frameInfo.image.height / 2 - shiftY;
canvas.translate(translateX, translateY);
canvas.rotate(angle);
canvas.drawImage(frameInfo.image, Offset.zero, Paint());
return pictureRecorder
.endRecording()
.toImage(frameInfo.image.width, frameInfo.image.height);}
请帮我解决这个问题。
这可能是因为您使用的是度数,而旋转函数需要的是弧度。当你插入 90 弧度时,它变成相当于 5156.62 度(最终效果是将对象旋转 116.62 度 - 略大于 90 度)
要将 angle
转换为弧度,请将该值乘以 pi/180
double radians = angle * pi / 180;
我正在尝试从中心旋转 ui.Image。我可以旋转图像,但图像没有旋转到准确的角度。我添加了下面的图片...
当我通过 0 作为工作线的角度时。
现在当我超过 90 度时你就可以解决问题了。小车转了90多
现在当我通过 180 度作为角度时,您就可以解决问题了。车转了180多
这是我的代码:
Future<ui.Image> getUiImage(String assetImageName, double angle) async {
final ByteData assetImageByteData = await rootBundle.load(imageAssetPath);
image.Image baseSizeImage =
image.decodeImage(assetImageByteData.buffer.asUint8List());
ui.Codec codec =
await ui.instantiateImageCodec(image.encodePng(baseSizeImage));
ui.FrameInfo frameInfo = await codec.getNextFrame();
var pictureRecorder = ui.PictureRecorder();
Canvas canvas = Canvas(pictureRecorder);
final double r = sqrt(frameInfo.image.width * frameInfo.image.width +
frameInfo.image.height * frameInfo.image.height) /
2;
final alpha = atan(frameInfo.image.height / frameInfo.image.width);
final beta = alpha + angle;
final shiftY = r * sin(beta);
final shiftX = r * cos(beta);
final translateX = frameInfo.image.width / 2 - shiftX;
final translateY = frameInfo.image.height / 2 - shiftY;
canvas.translate(translateX, translateY);
canvas.rotate(angle);
canvas.drawImage(frameInfo.image, Offset.zero, Paint());
return pictureRecorder
.endRecording()
.toImage(frameInfo.image.width, frameInfo.image.height);}
请帮我解决这个问题。
这可能是因为您使用的是度数,而旋转函数需要的是弧度。当你插入 90 弧度时,它变成相当于 5156.62 度(最终效果是将对象旋转 116.62 度 - 略大于 90 度)
要将 angle
转换为弧度,请将该值乘以 pi/180
double radians = angle * pi / 180;