Xamarin.Mac/System.Drawing.ImageをNSImageに変換する
< Xamarin.Mac
ナビゲーションに移動
検索に移動
2017年6月19日 (月) 04:24時点におけるimported>Monobookによる版
Xamarin.MacにおいてSystem.Drawing.ImageをAppKit.NSImageに変換する方法を試行錯誤している。
方法1
NSImageはファイルからのインスタンス生成はできるようだが、byte[]などのメモリ上のデータからのインスタンス生成はできない。 そこでCoreGraphicsのCGImageを経由して変換を行う。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Foundation;
using AppKit;
using CoreGraphics;
public static class NSImageExtensions
{
public static NSImage ToNSImage(this Image image)
{
NSImage nsImage = null;
byte[] buf = null;
// ImageをPNG形式でbyte[]に展開する。
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Png);
buf = ms.ToArray();
}
// メモリ使用量を抑えるため、ここでMemoryStreamは破棄する。
// byte[]からNSImageを生成する。
if (null != buf)
{
using (var dp = new CGDataProvider(buf, 0, buf.Length))
using (var cg = CGImage.FromPNG(dp, null, false, CGColorRenderingIntent.Default))
{
nsImage = new NSImage(cg, new SizeF(cg.Width, cg.Height));
}
}
return nsImage;
}
}
System.Drawing.ImageからのNSImageへの変換はともかく、byte[]からNSImageインスタンスの生成は、プログラム中でウェブなどからファイルを落としてきて表示するようなアプリの場合にはほぼ登場する手法になると思われる。
関連項目
- Xamarin.Mac
- Xamarin.Mac/NSImageをSystem.Drawing.Imageに変換する
- Xamarin.Mac/NSImageをファイルに保存する
- Xamarin.Mac/CGImageをNSImageに変換する