<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BoxHeadRoom &#187; IronPython</title>
	<atom:link href="http://boxheadroom.com/tag/ironpython/feed" rel="self" type="application/rss+xml" />
	<link>http://boxheadroom.com</link>
	<description>蝸牛の一歩</description>
	<lastBuildDate>Mon, 30 Jan 2012 13:45:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>【iPy】凸凹写真（仮）　ステレオ・ペア写真から奥行きデータ作成編</title>
		<link>http://boxheadroom.com/2010/01/16/deco_stereo_pair_to_z</link>
		<comments>http://boxheadroom.com/2010/01/16/deco_stereo_pair_to_z#comments</comments>
		<pubDate>Sat, 16 Jan 2010 05:46:27 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[IronPython]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Stereo]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=3685</guid>
		<description><![CDATA[凸凹写真（仮）の記事の続きです。
今度は、実写のステレオ写真（右目、左目用の写真がペアになったもの）から、奥行きデータを作成、凸凹写真（仮）にしてみました
拡大表示


画像はEmguのサンプルより。
コードは下に。
&#8212;-
この凸凹写真（仮）のアイディアは、 富士フイルム　FinePixREAL　3D　W1 の発売当初から考えていた、、、のですが、やっと（実験的にですが）　形にすることができました。


肝心のカメラは　まだ入手してないのですが（汗
今回のコードは、結構やっつけなのでアレですけれども、、、

余談 その1
　立体カメラのプロモーション用に、　『ステレオ（左右ペア）写真をアップロードすると、凸凹写真（仮）になるWEBサービス』（とか、SNS, 写真共有サイト） なんてのが有ると、Webでも気軽に立体写真の感じが楽しめて面白いかなぁと思ったりしました。
私自身は技術力が追いつかないので作れませんが（無念）　

余談 その２
　今年は3Dテレビなども発売されるみたいですが、ということは、うまくいけば、コンシュマーな3Dビデオカメラも松下やソニーから発売される可能性は有るのかしらん？
（というか、願望ですが。）
　ホームビデオな3D動画の標準化など、通産省に音頭をとって頂きたいところ。　個々にバラバラのフォーマットだと、オーサリング（ソフトを作る人）なんかも困るだろうし、消費者としても困るし。

さて、本題に戻りまして。
今回はironpython2.6を使用しました。
サンプル画像は、比較的きれいに奥行きデータを取得できました。

(凸凹写真（仮）の都合で、奥行きデータにぼかしをかけてあります)
ネット上に公開されている、いろんなステレオ写真で試したところ、元の写真によって、うまく奥行きを取得できる場合と、うまくいかない場合があるようです。
ものによっては、手書きで奥行きデータを与えてやったほうが、かえって綺麗な場合もあります。
Emgu CV ： OpenCV in .NET
.NET用のOpenCVラッパーライブラリ
IronPythonからも使えます。まだよく判らないので試行錯誤中

ダウンロード
サンプルEmgu.CV.SourceAndExample-1.5.0.1.zip

サンプルコード Simple3DReconstructionを、ほぼ引き写し。オリジナルはOpenGLを使ってポリゴンで奥行きを表示しているのですが、ビットマップの濃淡で出力するようにしました。
&#8593;
関連記事
下記のソフトのほうが断然スゴイ、のですが。

【トレたま】iPhoneソフトHourFace
顔写真を送ると、歳をとった自分の顔がポリゴンになって送られてくる、というアプリ。
モーションポートレイトは　スゴイですねー
【画像ぷるぷる】違った視点でソフト作ってみた
えろいので注意！
ポリゴンで超立体化＆有限要素解析

&#8593;
コード
まだ自分自身もライブラリの使い方がよくわかってないので、試行錯誤した後を清書せずに残してあります。
Emguのbinフォルダから、適当に必要なdll　（cv200.dll , Emgu.CV.dll などなど）を、このスクリプトと同じフォルダにコピーして実行してください。

画像データ 000_tex.jpg
奥行きデータ 000_z.jpg

が作成されます。 先日のphpのコードで swfファイルを作成するための素材として使用できます。

decoboco.py

import clr
clr.AddReference("Emgu.CV")
import Emgu.CV as cv
import System
import Emgu.CV.Structure as S
clr.AddReference("System.Drawing")
import System.Drawing as D
import Emgu.CV.CvEnum as E

fnleft="left.jpg"
fnright="right.jpg"
rev=0.
rev=1.

b=4
iml=cv.Image[S.Gray,System.Byte](fnleft)
imr=cv.Image[S.Gray,System.Byte](fnright)
im2=cv.Image[S.Gray,System.Int16](iml.Size)
im2r=cv.Image[S.Gray,System.Int16](iml.Size)
#bm=cv.StereoBM(E.STEREO_BM_TYPE.CV_STEREO_BM_BASIC,0)
#bm.FindStereoCorrespondence(iml,imr,im2)
gc = cv.StereoGC(8, 2)
gc.FindStereoCorrespondence(iml,imr,im2,im2r)
#im2 = im2 * (-16)
minvalue,maxvalue,minpoint,maxpoint=im2.MinMax()
dz=(maxvalue[0]-minvalue[0])
dz2=dz/2.0

if rev :
    #scale=-128*rev+128./(maxvalue[0]-minvalue[0])bm
    #im3=im2.Add(S.Gray(-dz2+minvalue[0]))
    im2-= [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://boxheadroom.com/2010/01/12/decoboco_tiger" rel="bookmark" title="Permanent Link to 【Flash】凸凹写真（仮）　トラ猫編">凸凹写真（仮）の記事</a>の続きです。</p>
<p>今度は、実写のステレオ写真（右目、左目用の写真がペアになったもの）から、奥行きデータを作成、凸凹写真（仮）にしてみました</p>
<p><a href="/wp/wp-content/uploads/2010/01/015.swf" target="_blank">拡大表示</a><br />
<object width="320" height="240"><param name="movie" value="http://boxheadroom.com/wp/wp-content/uploads/2010/01/015.swf]"></param>
<embed src="http://boxheadroom.com/wp/wp-content/uploads/2010/01/015.swf" type="application/x-shockwave-flash" width="320" height="240" ></embed></object></p>
<p>画像はEmguのサンプルより。<br />
コードは下に。<br />
&#8212;-<br />
この凸凹写真（仮）のアイディアは、 <a href="http://fujifilm.jp/personal/3d/camera/finepixreal3dw1/index.html">富士フイルム　FinePixREAL　3D　W1</a> の発売当初から考えていた、、、のですが、やっと（実験的にですが）　形にすることができました。<br />
<span id="more-3685"></span></p>
<div id="pukiwiki_content1" class="pukiwiki_content">
<p>肝心のカメラは　まだ入手してないのですが（汗</p>
<p>今回のコードは、結構やっつけなのでアレですけれども、、、</p>
<hr class="full_hr" />
<p>余談 その1<br />
　立体カメラのプロモーション用に、　『ステレオ（左右ペア）写真をアップロードすると、凸凹写真（仮）になるWEBサービス』（とか、SNS, 写真共有サイト） なんてのが有ると、Webでも気軽に立体写真の感じが楽しめて面白いかなぁと思ったりしました。</p>
<p>私自身は技術力が追いつかないので作れませんが（無念）　</p>
<hr class="full_hr" />
<p>余談 その２</p>
<p>　今年は3Dテレビなども発売されるみたいですが、ということは、うまくいけば、コンシュマーな3Dビデオカメラも松下やソニーから発売される可能性は有るのかしらん？<br />
（というか、願望ですが。）<br />
　ホームビデオな3D動画の標準化など、通産省に音頭をとって頂きたいところ。　個々にバラバラのフォーマットだと、オーサリング（ソフトを作る人）なんかも困るだろうし、消費者としても困るし。</p>
<hr class="full_hr" />
<p>さて、本題に戻りまして。</p>
<p>今回はironpython2.6を使用しました。<br />
サンプル画像は、比較的きれいに奥行きデータを取得できました。<br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2010/01/015_z.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2010/01/015_z.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2010/01/015_z.jpg" /></a><br />
(凸凹写真（仮）の都合で、奥行きデータにぼかしをかけてあります)</p>
<p>ネット上に公開されている、いろんなステレオ写真で試したところ、元の写真によって、うまく奥行きを取得できる場合と、うまくいかない場合があるようです。<br />
ものによっては、手書きで奥行きデータを与えてやったほうが、かえって綺麗な場合もあります。</p>
<h2 id="content_1_0"><a href="http://www.emgu.com/wiki/index.php/Main_Page" rel="nofollow">Emgu CV ： OpenCV in .NET</a></h2>
<p>.NET用のOpenCVラッパーライブラリ<br />
IronPythonからも使えます。まだよく判らないので試行錯誤中</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://sourceforge.net/projects/emgucv/files/" rel="nofollow">ダウンロード</a><br />
サンプルEmgu.CV.SourceAndExample-1.5.0.1.zip</li>
</ul>
<p>サンプルコード Simple3DReconstructionを、ほぼ引き写し。オリジナルはOpenGLを使ってポリゴンで奥行きを表示しているのですが、ビットマップの濃淡で出力するようにしました。</p>
<div class="jumpmenu"><a href="#pukiwiki_content1">&uarr;</a></div>
<h2 id="content_1_1">関連記事</h2>
<p>下記のソフトのほうが断然スゴイ、のですが。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://www.tv-tokyo.co.jp/wbs/toretama_blog/post_693.html" rel="nofollow">【トレたま】iPhoneソフトHourFace</a><br />
顔写真を送ると、歳をとった自分の顔がポリゴンになって送られてくる、というアプリ。<br />
モーションポートレイトは　スゴイですねー</li>
<li><a href="http://www.nicovideo.jp/watch/sm9277616" rel="nofollow">【画像ぷるぷる】違った視点でソフト作ってみた</a><br />
えろいので注意！<br />
ポリゴンで超立体化＆有限要素解析</li>
</ul>
<div class="jumpmenu"><a href="#pukiwiki_content1">&uarr;</a></div>
<h2 id="content_1_2">コード</h2>
<p>まだ自分自身もライブラリの使い方がよくわかってないので、試行錯誤した後を清書せずに残してあります。</p>
<p>Emguのbinフォルダから、適当に必要なdll　（cv200.dll , Emgu.CV.dll などなど）を、このスクリプトと同じフォルダにコピーして実行してください。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li>画像データ 000_tex.jpg</li>
<li>奥行きデータ 000_z.jpg</li>
</ul>
<p>が作成されます。 先日のphpのコードで swfファイルを作成するための素材として使用できます。</p>
</div>
<p>decoboco.py</p>
<pre class="code">
import clr
clr.AddReference("Emgu.CV")
import Emgu.CV as cv
import System
import Emgu.CV.Structure as S
clr.AddReference("System.Drawing")
import System.Drawing as D
import Emgu.CV.CvEnum as E

fnleft="left.jpg"
fnright="right.jpg"
rev=0.
rev=1.

b=4
iml=cv.Image[S.Gray,System.Byte](fnleft)
imr=cv.Image[S.Gray,System.Byte](fnright)
im2=cv.Image[S.Gray,System.Int16](iml.Size)
im2r=cv.Image[S.Gray,System.Int16](iml.Size)
#bm=cv.StereoBM(E.STEREO_BM_TYPE.CV_STEREO_BM_BASIC,0)
#bm.FindStereoCorrespondence(iml,imr,im2)
gc = cv.StereoGC(8, 2)
gc.FindStereoCorrespondence(iml,imr,im2,im2r)
#im2 = im2 * (-16)
minvalue,maxvalue,minpoint,maxpoint=im2.MinMax()
dz=(maxvalue[0]-minvalue[0])
dz2=dz/2.0

if rev :
    #scale=-128*rev+128./(maxvalue[0]-minvalue[0])bm
    #im3=im2.Add(S.Gray(-dz2+minvalue[0]))
    im2-= minvalue[0]
    #im3._Mul(-1)
    #minvalue,maxvalue,minpoint,maxpoint=im3.MinMax()
    scale=130./(dz)
    im2*=scale
    im2=255-im2
    #im2+=128
    #im4=im2.ConvertScale[System.Byte](scale,64.)
#else :
#    scale=64./dz2
#    im3=im2.ConvertScale[System.Byte](scale,0.)

#imb=im3.SmoothBlur(16,16)

im2=im2.SmoothBlur(b,b).SmoothBlur(b,b)
im2.Save("000_z.jpg")

#for i in [iml,imr,im2,im2r,im3,imb]:
for i in [iml,imr,im2,im2r]:
    i.Dispose()

import shutil
if fnleft.endswith(".jpg"):
    shutil.copy(fnleft,"000_tex.jpg")
else:
    im=cv.Image[S.Bgr,System.Byte](fnleft)
    im.Save("000_tex.jpg")
    im.Dispose()
</pre>
<p><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002IFUQOU/tamc-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/412SH1yJybL._SL160_.jpg" alt="FUJIFILM 3Dカメラ FinePix REAL ブラック F FX-3D W1" style="border: none;" /></a></p>

	Tags: <a href="http://boxheadroom.com/tag/flash" title="flash" rel="tag">flash</a>, <a href="http://boxheadroom.com/tag/ironpython" title="IronPython" rel="tag">IronPython</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a>, <a href="http://boxheadroom.com/tag/stereo" title="Stereo" rel="tag">Stereo</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2010/01/16/deco_stereo_pair_to_z/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MathematicaPlayerのフロントエンドを呼び出す</title>
		<link>http://boxheadroom.com/2009/11/10/mathematica_frontend_ipy</link>
		<comments>http://boxheadroom.com/2009/11/10/mathematica_frontend_ipy#comments</comments>
		<pubDate>Tue, 10 Nov 2009 05:30:11 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[IronPython]]></category>
		<category><![CDATA[Mathematica]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=3509</guid>
		<description><![CDATA[
プリンタのインクリボン待ち中。

無料のMathematica Player + IronRuby でグラフィック出力（hirax.net::inside out）
当blogの記事を取り上げて頂きました。
Ruby(Rails)も憶えたいなあと思っているのですが、なかなか手が出せないでおります（＾＾；

その後、IronPythonから、MathematicaPlayerのフロントエンドを呼び出す方法が判ったのでメモ。
　Plot3Dなどを使って描画した３Ｄグラフ等を、マウスで自由にグリグリと向きを変えて見ることが出来るようになります。


まずは　いろいろと初期化
カーネルMathKernel.exeのパスを指定して起動

import clr
clr.AddReferenceToFile("Wolfram.NETLink")
from Wolfram.NETLink import *

kernelLink=MathLinkFactory.CreateKernelLink(
"-linkmode autolaunch -linkname 'C:/Program Files/Wolfram Research/Mathematica Player/7.0/mathkernel.exe'")

kernelLink.WaitAndDiscardAnswer()

ここまでは従前どおり。
次に、フロントエンドMathematicaPlayer.exeの絶対パスを指定して起動します。

#主にkernellinkオブジェクトのEvaluatetoInputFormメソッドを使っていきます
＞＞＞　kernelLink.EvaluateToInputForm("1+1",0)
2  # 1+1なので、２が返ってきました

#ConnectToFrontEnd などの、フロントエンド関連命令を使えるようにします。
kernelLink.EvaluateToInputForm('Needs["JLink`"]',0)

#フロントエンドを起動します。
kernelLink.EvaluateToInputForm('ConnectToFrontEnd["C:/Program Files/Wolfram Research/Mathematica Player/7.0/MathematicaPlayer.exe"]',0)

　

これで、フロントエンドを使う準備が完了しました。

Plot3D関数を使い、3次元グラフを作成
UseFrontEnd関数、CreatekernelLink.EvaluateToInputFormcumentを使いフロントエンドに表示します。

p=kernelLink.EvaluateToInputForm("p=Plot3D[Cos[x*y],{x,-3,3},{y,-3,3}]",0)

kernelLink.EvaluateToInputForm("UseFrontEnd[CreateDocument[ p ]]",0)

グラフが、MathematicaPlayerのウィンドウに表示されたら成功です

マウスでドラッグすると、グリグリと向きが変化します。
使い終わったら、カーネルとの接続を切断します。

#フロントエンド MathematicaPlayer.exeを終了します
kernelLink.EvaluateToInputForm('CloseFrontEnd[]',0)

#MathKernel.exeを終了します。
kernelLink.Close()

残念ながら、インタラクティブにグラフを変化させたりとか、そういうのは判りませんでした。

	Tags: IronPython, Mathematica

	Related posts
	
	【iPy】凸凹写真（仮）　ステレオ・ペア写真から奥行きデータ作成編 (0)
	【もうすぐW杯】サッカーボールな地球儀のペーパークラフト (0)
	地震雲？ (0)
	怪獣算 (0)
	Mathematicaでメタボール (0)


]]></description>
			<content:encoded><![CDATA[<div id="pukiwiki_content3" class="pukiwiki_content">
<p>プリンタのインクリボン待ち中。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://www.hirax.net/diaryweb/2009/11/05.html#8488" rel="nofollow">無料のMathematica Player + IronRuby でグラフィック出力（hirax.net::inside out）</a><br />
当blogの記事を取り上げて頂きました。<br />
Ruby(Rails)も憶えたいなあと思っているのですが、なかなか手が出せないでおります（＾＾；</li>
</ul>
<p>その後、IronPythonから、MathematicaPlayerのフロントエンドを呼び出す方法が判ったのでメモ。</p>
<p>　Plot3Dなどを使って描画した３Ｄグラフ等を、マウスで自由にグリグリと向きを変えて見ることが出来るようになります。</p>
</div>
<p><span id="more-3509"></span></p>
<p>まずは　いろいろと初期化<br />
カーネルMathKernel.exeのパスを指定して起動</p>
<pre class="code">
import clr
clr.AddReferenceToFile("Wolfram.NETLink")
from Wolfram.NETLink import *

kernelLink=MathLinkFactory.CreateKernelLink(
"-linkmode autolaunch -linkname 'C:/Program Files/Wolfram Research/Mathematica Player/7.0/mathkernel.exe'")

kernelLink.WaitAndDiscardAnswer()
</pre>
<p>ここまでは従前どおり。</p>
<p>次に、フロントエンドMathematicaPlayer.exeの絶対パスを指定して起動します。</p>
<pre class="code">
#主にkernellinkオブジェクトのEvaluatetoInputFormメソッドを使っていきます
＞＞＞　kernelLink.EvaluateToInputForm("1+1",0)
2  # 1+1なので、２が返ってきました

#ConnectToFrontEnd などの、フロントエンド関連命令を使えるようにします。
kernelLink.EvaluateToInputForm('Needs["JLink`"]',0)

#フロントエンドを起動します。
kernelLink.EvaluateToInputForm('ConnectToFrontEnd["C:/Program Files/Wolfram Research/Mathematica Player/7.0/MathematicaPlayer.exe"]',0)

　
</pre>
<p>これで、フロントエンドを使う準備が完了しました。<br />
<!--<br />
では、クエン酸の分子模型を表示してみます。</p>
<p>UseFrontEnd関数、CreatekernelLink.EvaluateToInputFormcumentを使います。</p>
<pre class="code">
#クエン酸の分子模型を読み込み
#最初のデータ読み込みに15秒ほどかかります。
ca=kernelLink.EvaluateToInputForm(&#8217;ca= ChemicalData["CitricAcid","MoleculePlot"];&#8217;,0)

#フロントエンドに表示
kernelLink.EvaluateToInputForm(&#8217;UseFrontEnd[CreatekernelLink.EvaluateToInputFormcument[ ca ]]&#8217;,0)

　
</pre>
<p>新規ウィンドウが開き、分子模型が表示されたら成功です。<br />
<img src="http://boxheadroom.com/wp/wp-content/uploads/2009/11/ca.jpg"/></p>
<p>サンプルデータも表示してみます。</p>
<pre class="code">
#サンプルデータのウサギを読み込み。
#15秒ほどかかります。
bunny=kernelLink.EvaluateToInputForm('bunny= ExampleData[{"Geometry3D", "StanfordBunny"}];',0)

#フロントエンドに表示
kernelLink.EvaluateToInputForm('UseFrontEnd[CreatekernelLink.EvaluateToInputFormcument[ bunny ]]',0)

　
</pre>
<p><img src="http://boxheadroom.com/wp/wp-content/uploads/2009/11/bunny.jpg" /><br />
--></p>
<p>Plot3D関数を使い、3次元グラフを作成</p>
<p>UseFrontEnd関数、CreatekernelLink.EvaluateToInputFormcumentを使いフロントエンドに表示します。</p>
<pre class="code">
p=kernelLink.EvaluateToInputForm("p=Plot3D[Cos[x*y],{x,-3,3},{y,-3,3}]",0)

kernelLink.EvaluateToInputForm("UseFrontEnd[CreateDocument[ p ]]",0)
</pre>
<p>グラフが、MathematicaPlayerのウィンドウに表示されたら成功です</p>
<p><img src="http://boxheadroom.com/wp/wp-content/uploads/2009/11/cos.jpg" /><br />
マウスでドラッグすると、グリグリと向きが変化します。</p>
<p>使い終わったら、カーネルとの接続を切断します。</p>
<pre class="code">
#フロントエンド MathematicaPlayer.exeを終了します
kernelLink.EvaluateToInputForm('CloseFrontEnd[]',0)

#MathKernel.exeを終了します。
kernelLink.Close()
</pre>
<p>残念ながら、インタラクティブにグラフを変化させたりとか、そういうのは判りませんでした。</p>

	Tags: <a href="http://boxheadroom.com/tag/ironpython" title="IronPython" rel="tag">IronPython</a>, <a href="http://boxheadroom.com/tag/mathematica" title="Mathematica" rel="tag">Mathematica</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2010/01/16/deco_stereo_pair_to_z" title="【iPy】凸凹写真（仮）　ステレオ・ペア写真から奥行きデータ作成編 (1月 16, 2010)">【iPy】凸凹写真（仮）　ステレオ・ペア写真から奥行きデータ作成編</a> (0)</li>
	<li><a href="http://boxheadroom.com/2009/12/11/soccor_earth" title="【もうすぐW杯】サッカーボールな地球儀のペーパークラフト (12月 11, 2009)">【もうすぐW杯】サッカーボールな地球儀のペーパークラフト</a> (0)</li>
	<li><a href="http://boxheadroom.com/2009/11/17/eq_cloud" title="地震雲？ (11月 17, 2009)">地震雲？</a> (0)</li>
	<li><a href="http://boxheadroom.com/2009/11/14/kaiju_zan" title="怪獣算 (11月 14, 2009)">怪獣算</a> (0)</li>
	<li><a href="http://boxheadroom.com/2009/11/13/mathematica_metaball" title="Mathematicaでメタボール (11月 13, 2009)">Mathematicaでメタボール</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2009/11/10/mathematica_frontend_ipy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>無料のMathematica Playerで画像を出力してみた（IronPythonで）</title>
		<link>http://boxheadroom.com/2009/10/30/mathematica_ipy_image</link>
		<comments>http://boxheadroom.com/2009/10/30/mathematica_ipy_image#comments</comments>
		<pubDate>Thu, 29 Oct 2009 23:27:22 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[IronPython]]></category>
		<category><![CDATA[Mathematica]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=3474</guid>
		<description><![CDATA[
こちらの続きです
IronPythonから無料のMathematica Playerのカーネルを呼び出して、グラフなどの画像を出力してみました。




若干の説明
無料のMathematicaPlayerでは、基本的に入出力関係の関数が使えなくなっています。
なのですが、ビットマップデータに変換する機能のみは生きてましたので、こちらを使用して画像を出力することに。

Rasterize

Plot3Dなども、2次元の静止画としてなら書き出しできます。
&#8593;
注意書き
netlink.pyをインポート、使用する場合、　最初に画像を書き出すタイミングで、ダイアログが開きます。
MathematicaPlayer.exe の場所を指定してください。
画像データに変換するのに、フロントエンドであるMathematicaPlayerを使用するためです。
（MathKernel.exeではありませんので注意！）
2万5千円ぐらいでフル機能のMathematicaが買えるみたいなので、
&#8593;
使い方　サンプル
なんか、いろいろまんどくさい時もあるので、学生さんならフル機能版を買っちゃったほうが早そうです
（いきなり記事が台無し）
学生さんは2万5千円で買えるみたいです
ちっちゃいサインカーブ

&#62;&#62;&#62; from netlink import *
&#62;&#62;&#62; m=Mathematica()
&#62;&#62;&#62; m.open()
&#62;&#62;&#62; im=m.im(&#34;Plot[Sin[X],{x,0,2Pi}]&#34;,100,&#34;RGB&#34;)
&#62;&#62;&#62; im.Save(&#34;sin.png&#34;)
&#62;&#62;&#62; im.Dispose()

Mathematica で微分方程式を解く方法を教えてください
ローレンツアトラクタ。コードはそのままで、視点の位置だけ変更しました


ドラム式の洗濯機みたい。


（前略） 上記の続きで
m.do("""solution=
  NDSolve[
    {Derivative[1][x][t]== -3*(x[t]-y[t]),
     Derivative[1][y][t]==
       26.5*x[t]-y[t]-x[t]*z[t],
     Derivative[1][z][t]==x[t]*y[t]-z[t],
     x[0]==z[0]==0,
     y[0]==2},{x,y,z},{t,0,17}];""")

im=m.im("""ParametricPlot3D[
  Evaluate[{x[t],y[t],z[t]}/.solution],
   {t,0,17},PlotPoints -&#62;1000,ViewPoint-&#62;{1,0,1}]""",500,"RGBA")

im.Save("r.jpg")



im=m.im(&#34;&#34;&#34;ListLinePlot[{Re[#], Im[#]} [...]]]></description>
			<content:encoded><![CDATA[<div id="pukiwiki_content7" class="pukiwiki_content">
<p><a href="http://boxheadroom.com/2009/10/23/mathematica_ironpython_webapi" rel="nofollow">こちらの続きです</a></p>
<p>IronPythonから無料のMathematica Playerのカーネルを呼び出して、グラフなどの画像を出力してみました。<br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2009/10/r.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2009/10/r-150x150.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2009/10/r.jpg" /></a></p>
</div>
<p><span id="more-3474"></span></p>
<div id="pukiwiki_content8" class="pukiwiki_content">
<h2 id="content_1_0">若干の説明</h2>
<p>無料のMathematicaPlayerでは、基本的に入出力関係の関数が使えなくなっています。<br />
なのですが、ビットマップデータに変換する機能のみは生きてましたので、こちらを使用して画像を出力することに。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://reference.wolfram.com/mathematica/ref/Rasterize.html" rel="nofollow">Rasterize</a></li>
</ul>
<p>Plot3Dなども、2次元の静止画としてなら書き出しできます。</p>
<div class="jumpmenu"><a href="#pukiwiki_content8">&uarr;</a></div>
<h2 id="content_1_1">注意書き</h2>
<p>netlink.pyをインポート、使用する場合、　最初に画像を書き出すタイミングで、ダイアログが開きます。<br />
MathematicaPlayer.exe の場所を指定してください。</p>
<p>画像データに変換するのに、フロントエンドであるMathematicaPlayerを使用するためです。<br />
（MathKernel.exeではありませんので注意！）</p>
<p>2万5千円ぐらいでフル機能のMathematicaが買えるみたいなので、</p>
<div class="jumpmenu"><a href="#pukiwiki_content8">&uarr;</a></div>
<h2 id="content_1_2">使い方　サンプル</h2>
<p>なんか、いろいろまんどくさい時もあるので、学生さんならフル機能版を買っちゃったほうが早そうです<br />
（いきなり記事が台無し）<br />
学生さんは2万5千円で買えるみたいです</p>
<p>ちっちゃいサインカーブ<br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2009/10/sin.png" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2009/10/sin.png" alt="http://boxheadroom.com/wp/wp-content/uploads/2009/10/sin.png" /></a></p>
<pre>&gt;&gt;&gt; from netlink import *
&gt;&gt;&gt; m=Mathematica()
&gt;&gt;&gt; m.open()
&gt;&gt;&gt; im=m.im(&quot;Plot[Sin[X],{x,0,2Pi}]&quot;,100,&quot;RGB&quot;)
&gt;&gt;&gt; im.Save(&quot;sin.png&quot;)
&gt;&gt;&gt; im.Dispose()</pre>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://library.wolfram.com/howtos/diffeq/index.ja.html" rel="nofollow">Mathematica で微分方程式を解く方法を教えてください</a><br />
ローレンツアトラクタ。コードはそのままで、視点の位置だけ変更しました</li>
</ul>
<p><a href="http://boxheadroom.com/wp/wp-content/uploads/2009/10/r.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2009/10/r.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2009/10/r.jpg" /></a><br />
ドラム式の洗濯機みたい。</p>
</div>
<pre class="code">
（前略） 上記の続きで
m.do("""solution=
  NDSolve[
    {Derivative[1][x][t]== -3*(x[t]-y[t]),
     Derivative[1][y][t]==
       26.5*x[t]-y[t]-x[t]*z[t],
     Derivative[1][z][t]==x[t]*y[t]-z[t],
     x[0]==z[0]==0,
     y[0]==2},{x,y,z},{t,0,17}];""")

im=m.im("""ParametricPlot3D[
  Evaluate[{x[t],y[t],z[t]}/.solution],
   {t,0,17},PlotPoints -&gt;1000,ViewPoint-&gt;{1,0,1}]""",500,"RGBA")

im.Save("r.jpg")
</pre>
<div id="pukiwiki_content9" class="pukiwiki_content">
<p><a href="http://boxheadroom.com/wp/wp-content/themes/mydefault/images/gamma.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/themes/mydefault/images/gamma.jpg" alt="http://boxheadroom.com/wp/wp-content/themes/mydefault/images/gamma.jpg" /></a></p>
<pre>im=m.im(&quot;&quot;&quot;ListLinePlot[{Re[#], Im[#]} &amp; /@
   Accumulate[Exp[I 10.^4 EulerGamma Sqrt[Range[5000]]]],Axes-&gt;False ]&quot;&quot;&quot;,500,&quot;RGBA&quot;)</pre>
<p>オイラーの定数ガンマ、、、とかよくわかりません（＞＜）　今度勉強します。<br />
<a href="http://reference.wolfram.com/mathematica/ref/EulerGamma.html#1739425765" rel="nofollow">EulerGammaを含むWeyl型の総和：</a></p>
<p>よくわかりませんが綺麗ですねー</p>
<h2 id="content_1_0">必要なソフト</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://wolfram.com/products/player/index.ja.html" rel="nofollow">MathematicaPlayer</a></li>
<li><a href="http://www.codeplex.com/IronPython" rel="nofollow">IronPython</a><br />
今回は2.6RC2を使用</li>
</ul>
<div class="jumpmenu"><a href="#pukiwiki_content9">&uarr;</a></div>
<h2 id="content_1_1">必要なモジュール</h2>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://boxheadroom.com/2009/10/29/ironpython_smallpil" rel="nofollow">image.py モジュール</a></li>
<li><a href="http://www.wolfram.com/solutions/mathlink/netlink/downloading.html" rel="nofollow">.NetLink</a><br />
アーカイブ中のWolfram.NETLink.dllをスクリプトと同じフォルダに。</li>
</ul>
<div class="jumpmenu"><a href="#pukiwiki_content9">&uarr;</a></div>
<h3 id="content_1_2">わかっている不具合</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li>内部的に、Mathematicaの変数をいくつか使用しています<br />
$ipyimagedata,$ipycolortransなど。<br />
プログラム中で、変数名がかぶらないように気をつけてください。<br />
あと、メモリが開放されないかも、なので、適宜 $ipyimagedata=0　などと、してやってください。</li>
<li>画像の横幅指定は、あくまで目安です<br />
出力画像では、若干変わります</li>
<li>横幅によっては、画像が乱れます<br />
透明度付きモード &quot;RGBA&quot;を指定してやると、乱れが治る。。。場合もあります。</li>
</ul>
<pre>m.im(&quot;Plot[Sin[x],{x,0,2Pi}]&quot;,100,&quot;RGBA&quot;)</pre>
<div class="jumpmenu"><a href="#pukiwiki_content9">&uarr;</a></div>
<h2 id="content_1_3">ソースコード</h2>
</div>
<p>netlink.pyとして保存</p>
<pre class="code">
#-*- coding:utf-8 -*-
"netlink.py"
import clr , System
from System import Array,Byte
clr.AddReferenceToFile("Wolfram.NETLink")
from Wolfram.NETLink import *
import sys
import image

exe1="mathkernel.exe"
exe2="MathematicaPlayer.exe"
mlpath="-linkmode autolaunch -linkname "
#Full Path To MathKernel.exe
mlpath+=" 'C:&#x5c;&#x5c;Program Files&#x5c;&#x5c;Wolfram Research&#x5c;&#x5c;Mathematica Player&#x5c;&#x5c;7.0&#x5c;&#x5c;%s' "

def fe():
  NL=MathLinkFactory.CreateMathLink(mlpath%exe2)
  return NL

def ev(txt):
  return eval(txt.replace("{","(").replace("}",")"))

class Mathematica(object):
  def open(self):
    "init"
    self.KL=MathLinkFactory.CreateKernelLink(mlpath%exe1)
    self.KL.WaitAndDiscardAnswer()

  def do(self,command):
    "evaluate to input form"
    return self.KL.EvaluateToInputForm(command, 0)

  def get(self,name):
    "get value in symbol"
    #変数の値を、.NETのオブジェクトとして読み出し
    #変数のみ。　式の評価結果などを直接読み出すことは出来ません。
    self.KL.PutFunction("EvaluatePacket",1)
    self.KL.PutSymbol(name)
    self.KL.EndPacket()
    self.KL.WaitForAnswer()
    try:
      ret=self.KL.GetObject()
    except Exception:
      self.KL.ClearError()
      self.do("")
      self.KL.Flush()
      while not self.KL.Ready:
        pass
      while self.KL.Ready:
        self.KL.WaitAndDiscardAnswer()
      ret=self.do(name)
    return ret

  def imagedata(self,txt,w,mode="RGB"):
    "evaluate to image data array"
    if mode=="RGBA":
      bg=",Background-&gt;None"
      self.do("$ipycolortrans={{0,0,1,0},{0,1,0,0},{1,0,0,0},{0,0,0,1}};")
    else :
      bg=""
      self.do("$ipycolortrans={{0,0,1},{0,1,0},{1,0,0}};")

    tmpl='$ipyimagedata=Rasterize[%(txt)s,"Image",RasterSize-&gt;%(w)s%(bg)s];'
    self.do(tmpl%locals())

    if self.do('ImageQ[$ipyimagedata]')!="True":
      return
    self.do('$ipyimagedata=ImageData[$ipyimagedata,"Byte"];')
    self.do('$ipyimagedata2=$ipycolortrans.#&#038;[#]&#038;/@#&#038;/@$ipyimagedata;')
    return self.get("$ipyimagedata2")    

  def im(self,txt,w,mode="RGB"):
    "evaluate to image"
    dat=self.imagedata(txt,w,mode)
    if dat :
      return image.fromArray(dat)

  def close(self):
    self.KL.EvaluateToInputForm('Quit[]', 0)
    self.KL.Close()
</pre>

	Tags: <a href="http://boxheadroom.com/tag/cg" title="CG" rel="tag">CG</a>, <a href="http://boxheadroom.com/tag/ironpython" title="IronPython" rel="tag">IronPython</a>, <a href="http://boxheadroom.com/tag/mathematica" title="Mathematica" rel="tag">Mathematica</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2009/10/30/mathematica_ipy_image/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IronPythonで画像ファイルを読み書き</title>
		<link>http://boxheadroom.com/2009/10/29/ironpython_smallpil</link>
		<comments>http://boxheadroom.com/2009/10/29/ironpython_smallpil#comments</comments>
		<pubDate>Thu, 29 Oct 2009 01:44:04 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[IronPython]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=3463</guid>
		<description><![CDATA[
IronPythonで画像ファイルを扱うための簡単なモジュール。
憶えやすいように、関数名をPILっぽい名前にしてあります。
あと、IronPython2.0から、PILやNumpyなどの、Cで書かれたモジュールを呼び出す方法もメモ。



作成にあたって、数え切れないほどのサイトを参考にさせていただきました。
PIL本家ではIronPILというのを開発しているみたいなのですが、現在はまだ公開されてないみたいです。残念。
ironclad
こちらのironcladモジュールを使用すると、PIL、NumPyなどをIronPython2.0から使うことが出来ます。CPythonで慣れたモジュールが使えて楽々♪
まだ、IronPython2.6RC2では動かないみたいです。
独自に内部で各モジュールにパッチをあててるみたいで、全てのPydが動くわけでは無いみたいです。
&#8593;
関数リスト
画像データは、.NetのSystem.Drawing.Bitmapクラスを使用することとします。
保存はBitmapオブジェクトのSave(ファイル名) メソッドで行います。
&#8593;
チュートリアル

DOBON.NET &#62; プログラミング道 &#62; .NET Tips　＞ 画像、印刷編
逆引き.NET：ITpro



new(mode,size)
　　Bitmapを作成
load(filename)
　　Bitmapとして読込
toArray(bmp)
　　Bitmapの画素データを配列に読み込み
fromArray(mode,size,array)
　　画像データが格納された配列をBitmapに
toMstring(bmp)
　Bitmapを配列に読込。さらにMathematica形式の文字列に変換します。
iterInt( Mstring)
　Mathematica形式の文字列で表現された配列データから、整数データを一個づつ取り出すイテレータを作成。（配列の次元は無視）
fromstring  tostring
　PILの同名関数同等品（？）
　ただし、上下逆になってるかも

&#8593;
メモ
CPythonだと、普段はデストラクタを使用しませんが、IronPytthonでは、Bitmapオブジェクトは、こまめにDispose() メソッドで削除したほうがいいかも？（よくわからず）

動作確認 IronPython RC2
image.pyとして保存

# -*- coding: utf8 -*-
"image.py　　　small pil"
import clr
import System
from System import Array,Byte
clr.AddReferenceByPartialName("System.Drawing")
from System.Drawing import Bitmap,Rectangle,RotateFlipType,Color
from System.Drawing.Imaging import PixelFormat,ImageLockMode
from System.Runtime.InteropServices import Marshal

def new (mode,size):
  w,h=size
  mode2,n=_mode(mode)
  bmp = Bitmap(w, h, mode2)
  return bmp

def _mode(mode):
  mode=mode.lower()
  if mode=="rgb":
  [...]]]></description>
			<content:encoded><![CDATA[<div id="pukiwiki_content12" class="pukiwiki_content">
<p>IronPythonで画像ファイルを扱うための簡単なモジュール。<br />
憶えやすいように、関数名をPILっぽい名前にしてあります。</p>
<p>あと、IronPython2.0から、PILやNumpyなどの、Cで書かれたモジュールを呼び出す方法もメモ。</p>
</div>
<p><span id="more-3463"></span></p>
<div id="pukiwiki_content13" class="pukiwiki_content">
<p>作成にあたって、数え切れないほどのサイトを参考にさせていただきました。</p>
<p>PIL本家ではIronPILというのを開発しているみたいなのですが、現在はまだ公開されてないみたいです。残念。</p>
<h2 id="content_1_0"><a href="http://code.google.com/p/ironclad/" rel="nofollow">ironclad</a></h2>
<p>こちらのironcladモジュールを使用すると、PIL、NumPyなどをIronPython2.0から使うことが出来ます。CPythonで慣れたモジュールが使えて楽々♪</p>
<p>まだ、IronPython2.6RC2では動かないみたいです。<br />
独自に内部で各モジュールにパッチをあててるみたいで、全てのPydが動くわけでは無いみたいです。</p>
<div class="jumpmenu"><a href="#pukiwiki_content13">&uarr;</a></div>
<h2 id="content_1_1">関数リスト</h2>
<p>画像データは、.Netの<a href="http://msdn.microsoft.com/ja-jp/library/system.drawing.bitmap_members%28printer%29.aspx" rel="nofollow">System.Drawing.Bitmapクラス</a>を使用することとします。</p>
<p>保存はBitmapオブジェクトのSave(ファイル名) メソッドで行います。</p>
<div class="jumpmenu"><a href="#pukiwiki_content13">&uarr;</a></div>
<h3 id="content_1_2">チュートリアル</h3>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://dobon.net/vb/dotnet/graphics/index.html" rel="nofollow">DOBON.NET &gt; プログラミング道 &gt; .NET Tips　＞ 画像、印刷編</a></li>
<li><a href="http://itpro.nikkeibp.co.jp/develop/dotnet/index.html" rel="nofollow">逆引き.NET：ITpro</a></li>
</ul>
<hr class="full_hr" />
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li>new(mode,size)<br />
　　Bitmapを作成</li>
<li>load(filename)<br />
　　Bitmapとして読込</li>
<li>toArray(bmp)<br />
　　Bitmapの画素データを配列に読み込み</li>
<li>fromArray(mode,size,array)<br />
　　画像データが格納された配列をBitmapに</li>
<li>toMstring(bmp)<br />
　Bitmapを配列に読込。さらにMathematica形式の文字列に変換します。</li>
<li>iterInt( Mstring)<br />
　Mathematica形式の文字列で表現された配列データから、整数データを一個づつ取り出すイテレータを作成。（配列の次元は無視）</li>
<li>fromstring  tostring<br />
　PILの同名関数同等品（？）<br />
　ただし、上下逆になってるかも</li>
</ul>
<div class="jumpmenu"><a href="#pukiwiki_content13">&uarr;</a></div>
<h2 id="content_1_3">メモ</h2>
<p>CPythonだと、普段はデストラクタを使用しませんが、IronPytthonでは、Bitmapオブジェクトは、こまめにDispose() メソッドで削除したほうがいいかも？（よくわからず）</p>
</div>
<p>動作確認 IronPython RC2</p>
<p>image.pyとして保存</p>
<pre class="code">
# -*- coding: utf8 -*-
"image.py　　　small pil"
import clr
import System
from System import Array,Byte
clr.AddReferenceByPartialName("System.Drawing")
from System.Drawing import Bitmap,Rectangle,RotateFlipType,Color
from System.Drawing.Imaging import PixelFormat,ImageLockMode
from System.Runtime.InteropServices import Marshal

def new (mode,size):
  w,h=size
  mode2,n=_mode(mode)
  bmp = Bitmap(w, h, mode2)
  return bmp

def _mode(mode):
  mode=mode.lower()
  if mode=="rgb":
    mode2=PixelFormat.Format24bppRgb
    nchannel=3
  elif  mode in "rgba" :
    mode2=PixelFormat.Format32bppArgb
    nchannel=4
  else :
    raise 'mode = "RGB" or "RGBA"'
  return mode2,nchannel

def fromArray(*args):
  if len(args)==3:
    mode,size,dat=args
    return fromArray1D(mode,size,dat)
  elif len(args)==1 :
    dat=args[0]
    if isinstance(dat,Array):
      h,w,n=[dat.GetLength(i) for i in xrange(3)]
      a=Array[Byte](dat)
      mode=[None,None,None,"RGB","RGBA",][n]
      return fromArray1D(mode,(w,h),a)
  return None

def fromArray1D(mode,size,dat):
  #http://d.hatena.ne.jp/okazuki/20060828/1156726184
  w,h=size
  mode2,n=_mode(mode)
  bmp=new(mode,(w,h))
  rct=Rectangle(0, 0, w, h)
  bd=bmp.LockBits( rct, ImageLockMode.WriteOnly, mode2);
  Marshal.Copy(dat, 0, bd.Scan0, w*h*n);
  bmp.UnlockBits(bd);
  bmp.RotateFlip(RotateFlipType.Rotate180FlipXY)
  return bmp

def frombuffer(mode,size,buf):
  dat=Array[Byte](buf)
  return fromArray(mode,size,buf)

def iterInt(txt):
    pat=re.compile(r"(\d+)")

    return (int(x.group(1)) for x in pat.finditer(txt) )

def toArray(bmp):
  u"Bitmapの内部データにアクセスする"
  #"http://d.hatena.ne.jp/Guernsey/20090226"
  # http://blogs.yahoo.co.jp/spike_spike690/4735887.html
  # Pixelデータにアクセスする領域を設定する
  w,h=bmp.Width,bmp.Height
  rect = Rectangle(0, 0, w,h)
  # BitmapDataクラスのインスタンスを生成し、LockBits関数でBitmapをLockする。
  bmpData = bmp.LockBits(rect,ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb)
  # BitmapData内の各種項目を抜き出す。
  ptr = bmpData.Scan0
  imageStride =bmpData.Stride
  # コピーするデータ量を設定．PixelFormat に関わらず stride * 高さ
  bytes = imageStride * h
  imageData = Array[Byte](Length(bytes))
  # 確保したデータ配列にBitmap内のデータをコピー
  Marshal.Copy(ptr, imageData, 0, bytes)
  # Bitmapのロックを解除する。

  bmp.UnlockBits(bmpData)
  return imageData

def fromMstring(mode,size,txt):
  "from string to Bitmap"
  w,h=size
  mode2,n=_mode(mode)
  dat=Array[Byte](Length(w*h*n,iterInt(txt)))
  im=fromArray(mode,size,dat)
  return im
def toMstring(x):
  if isinstance(x,Bitmap) :
    bmp=x
    w=bmp.Width
    n=bmp.GetPixelFormatSize(bmp.PixelFormat)//8
    a=toArray(bmp)
    return 'Partition[Partition[{%s},%s],%s]'%(
                        ",".join((str(i) for i in a)),n,w)

#  #http://sonic64.com/2005-08-04.html
def fromstring(mode,size,txt):
  "fromstring PIL style"
  w,h=size
  mode2,n=_mode(mode)
  dat=Encoding.Unicode.GetBytes(txt)[::2]
  im=fromArray(mode,size,dat)
  return im

def tostring(x):
  "tostring PIL style"
  bmp=x
  a=toArray(bmp)
  return "".join((chr(i) for i in a))

def load(fname):
  return Bitmap(fname)
import re

class Length(object):
  def __init__(self,length,itr=None):
    self.length=length
    self.itr=itr
  def __len__(self):
    return self.length
  def __iter__(self):
    if self.itr :
      length=self.length
      def counter(var=[0]):
        var[0]+=1
        if var[0]&gt;length :
          raise StopIteration
        return var[0]
      return (counter() and i for i in self.itr )
    else :
      return ( 0 for i in xrange(self.length))
</pre>

	Tags: <a href="http://boxheadroom.com/tag/cg" title="CG" rel="tag">CG</a>, <a href="http://boxheadroom.com/tag/ironpython" title="IronPython" rel="tag">IronPython</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2009/10/29/ironpython_smallpil/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

