差分

ナビゲーションに移動 検索に移動

Xamarin.MacでNSImageを回転させる

2,115 バイト追加, 2017年11月1日 (水) 07:14
ページの作成:「NSImageをサクッと回転させたい。 動くことは動いたが負荷を計測したところ微妙に重いようなので次回はCGImageを回転させてみ...」
NSImageをサクッと回転させたい。
動くことは動いたが負荷を計測したところ微妙に重いようなので次回はCGImageを回転させてみようと思う。

<source lang="csharp">
using System;
using AppKit;
using Foundation;
using CoreGraphics;

public static class NSImageExtensions
{
public static NSImage Rotate(this NSImage nsImage, float degrees)
{
degrees = degrees % 360f;
if (degrees == 0f)
{// 回転の必要なし
return nsImage;
}

CGSize size = nsImage.Size;
CGSize maxSize;
if (90f == degrees || 270f == degrees || -90f == degrees || -270f == degrees)
{
maxSize = new CGSize(size.Height, size.Width);
}
else if (180f == degrees || -180f == degrees)
{
maxSize = size;
}
else
{
maxSize = new CGSize(20 + NMath.Max(size.Width, size.Height), 20 + NMath.Max(size.Width, size.Height));
}

var rot = new NSAffineTransform();
rot.RotateByDegrees(degrees);

var center = new NSAffineTransform();
center.Translate(deltaX: maxSize.Width / 2, deltaY: maxSize.Height / 2);
rot.AppendTransform(center);

// 新しい画像
var newImage = new NSImage(maxSize);

// 描画
newImage.LockFocus();
rot.Concat();
var rect = new CGRect(0, 0, size.Width, size.Height);
var corner = new CGPoint(-size.Width / 2, -size.Height / 2);
nsImage.Draw(point: corner, fromRect: rect, op: NSCompositingOperation.Copy, delta: 1.0f);
newImage.UnlockFocus();

return newImage;
}
}
</source>

== 関連項目 ==
* [[Xamarin.Mac/CGImageをNSImageに変換する]]
* [[Xamarin.Mac/NSImageをファイルに保存する]]
* [[Xamarin.Mac/NSViewの座標系を左下原点から左上原点に変更する]]

[[category: Xamarin.Mac]]
匿名利用者

案内メニュー