「Xamarin.Mac/System.Drawing.ImageをNSImageに変換する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「MonoMacにおいてSystem.Drawing.ImageをMonoMac.AppKit.NSImageに変換する方法を試行錯誤している。 ==方法1== NSImageはファイルからのイン...」)
 
 
(3人の利用者による、間の7版が非表示)
1行目: 1行目:
[[MonoMac]]においてSystem.Drawing.ImageをMonoMac.AppKit.NSImageに変換する方法を試行錯誤している。
+
Xamarin.MacにおいてSystem.Drawing.ImageをAppKit.NSImageに変換する方法を試行錯誤している。
 +
 
 +
== 方法1 ==
 +
NSImageは[[ファイル]]からのインスタンス生成はできるようだが、byte[]などのメモリ上の[[データ]]からのインスタンス生成はできない。
 +
そこでCoreGraphicsのCGImageを経由して変換を行う。大雑把には以下のような手順をとった。
 +
# ImageをMemoryStreamに保存
 +
# MemoryStreamからCGImageを生成
 +
# CGImageをNSImageに変換
  
==方法1==
 
NSImageはファイルからのインスタンス生成はできるようだが、byte[]などのメモリ上のデータからのインスタンス生成はできない。
 
そこでMonoMac.CoreGraphicsのCGImageを経由して変換を行う。
 
 
<source lang="csharp">
 
<source lang="csharp">
 
     using System;
 
     using System;
9行目: 13行目:
 
     using System.Drawing.Imaging;
 
     using System.Drawing.Imaging;
 
     using System.IO;
 
     using System.IO;
     using MonoMac.Foundation;
+
     using Foundation;
     using MonoMac.AppKit;
+
     using AppKit;
     using MonoMac.CoreGraphics;
+
     using CoreGraphics;
  
     public static class NSImageExtentions
+
     public static class NSImageExtensions
 
     {
 
     {
 
         public static NSImage ToNSImage(this Image image)  
 
         public static NSImage ToNSImage(this Image image)  
34行目: 38行目:
 
                 using (var cg = CGImage.FromPNG(dp, null, false, CGColorRenderingIntent.Default))
 
                 using (var cg = CGImage.FromPNG(dp, null, false, CGColorRenderingIntent.Default))
 
                 {
 
                 {
                     nsImage = NSImage(cg, new SizeF(cg.Width, cg.Height));
+
                     nsImage = new NSImage(cg, new SizeF(cg.Width, cg.Height));
 
                 }
 
                 }
 
             }
 
             }
43行目: 47行目:
 
</source>
 
</source>
  
System.Drawing.ImageからのNSImageへの変換はともかく、byte[]からNSImageインスタンスの生成は、ウェブなどからファイルを落としてくるようなアプリの場合には、ほぼ登場する手法となると思われる。
+
System.Drawing.ImageからのNSImageへの変換はともかく、byte[]からNSImageインスタンスの生成は、[[プログラム]]中で[[ウェブ]]などから[[ファイル]]を落としてきて表示するようなアプリの場合にはほぼ登場する手法になると思われる。
  
==関連項目==
+
== 関連項目 ==
*[[MonoMac]]
+
* [[Xamarin.Mac]]
*[[MonoMac/NSImageをSystem.Drawing.Imageに変換する]]
+
* [[Xamarin.Mac/NSImageをSystem.Drawing.Imageに変換する]]
*[[MonoMac/NSImageをファイルに保存する]]
+
* [[Xamarin.Mac/NSImageをファイルに保存する]]
 +
* [[Xamarin.Mac/CGImageをNSImageに変換する]]
  
 
==参考文献==
 
==参考文献==
54行目: 59行目:
  
 
{{stub}}
 
{{stub}}
 +
 +
[[category: Xamarin.Mac]]
 +
[[category: MonoMac]]

2017年7月6日 (木) 06:40時点における最新版

Xamarin.MacにおいてSystem.Drawing.ImageをAppKit.NSImageに変換する方法を試行錯誤している。

方法1[編集 | ソースを編集]

NSImageはファイルからのインスタンス生成はできるようだが、byte[]などのメモリ上のデータからのインスタンス生成はできない。 そこでCoreGraphicsのCGImageを経由して変換を行う。大雑把には以下のような手順をとった。

  1. ImageをMemoryStreamに保存
  2. MemoryStreamからCGImageを生成
  3. CGImageをNSImageに変換
    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インスタンスの生成は、プログラム中でウェブなどからファイルを落としてきて表示するようなアプリの場合にはほぼ登場する手法になると思われる。

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]