差分

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

Xamarin.MacでNSImageをSystem.Drawing.Imageに変換する

2,262 バイト追加, 2015年1月24日 (土) 06:35
ページの作成:「MonoMacにおいてMonoMac.AppKit.NSImageをSystem.Drawing.Imageに変換する方法を試行錯誤している。 ==方法1== NSImageは基本的にTIFFファイ...」
[[MonoMac]]においてMonoMac.AppKit.NSImageをSystem.Drawing.Imageに変換する方法を試行錯誤している。

==方法1==
NSImageは基本的に[[TIFFファイル]]のようなので、System.Drawing.Imageが読み込める[[PNGファイル]]に変換を行い、ImageにStreamを食わせる。
<source lang="csharp">
using System;
using System.Drawing;
using System.IO;
using MonoMac.Foundation;
using MonoMac.AppKit;

public static class NSImageExtentions
{
public static Image ToImage(this NSImage image)
{
using (var imageDataTiff = image.AsTiff())
using (var imageRep = NSBitmapImageRep.ImageRepFromData(imageDataTiff) as NSBitmapImageRep)
using (var imageProps = new NSDictionary())
using (var imageDataPng = imageRep.RepresentationUsingTypeProperties(NSBitmapImageFileType.Png, imageProps))
using (var imageStreamPng = imageDataPng.AsStream())
{
return Image.FromStream(imageStreamPng);
}
}
</source>

なお、MonoMacのクラス群はほぼDisposeメソッドを実装しており、[[メモリリーク]]を防ぐために「using」が重要となる。
大容量の[[メモリ]]を搭載している昨今の[[Mac]]では多少の[[メモリリーク]]をする[[アプリ]]でも大して問題にならないが、MonoMac.QTKitを使った[[ビデオキャプチャ]]などでは1フレームごとに上記のような処理が走り、1/30秒や1/60秒といった速度で多種多様な[[インスタンス]]が生成され続けるため、Disposeを怠ると凄い勢いで[[メモリリーク]]することになる。

これに加えてビデオキャプチャではSystem.GC.Collectメソッドの手動実行も重要な場合がある。
ビデオキャプチャなどの常時負荷が高い状況化では[[ガベージコレクション]]の自動実行だけでは処理が追いつかない場合があるようだ。

ちなみにSystem.GC.Collectをメインスレッド以外で実行しても効果がないようだ。
凄い嵌った。

==関連項目==
*[[MonoMac]]
*[[MonoMac/NSImageをファイルに保存する]]

==参考文献==
{{reflist}}

{{stub}}
匿名利用者

案内メニュー