OpenGLというかCinderでdrawしたラインをEPS形式で保存してみる
昨夜弊社でイベント(飲み会?)を開催したのですが、
お越しいただいた皆様ありがとうございました。
イベントでやりましたVJ的なアレについては
また機会をみてレポートできたらと思います。
こんにちはジョーとも呼ばれたりするムーチョです。
OPENGLというかCinderでdrawしたラインを印刷したい!
そのためにEPS形式にできないものかと
あれこれやってみて、とりあえずこれでいいんじゃないか?
というところにたどり着いたのでそのご紹介です。
EPS保存ですが、いくつか方法がありました。
このライブラリは結局今回使わなかったのですが
王道っぽいのでメモ。
GL2PS: an OpenGL to PostScript printing library
http://geuz.org/gl2ps/
今回紹介するのは、Cinderのライブラリに入ってるCairoで書き出す方法です。
[code lang="cpp"]
// 描画した座標の配列
vector<vector<Vec2f> > shapePoints;
//-----------------------------------------------------
// 指定したファイル名でEPS保存
void saveEPS(string path)
{
cairo::Context ctx( cairo::SurfaceEps( path + ".eps", getWindowWidth(), getWindowHeight() ) );
drawVectorLine( ctx );
}
//-----------------------------------------------------
// EPSデータ用にあらためて描画(?)
void drawVectorLine(cairo::Context &amp;amp;ctx)
{
ctx.setLineWidth( 0.1f );
ctx.setSourceRgb( 0, 0, 0 );
Vec2f p0, p1;
int i,j,k;
for(i = 0; i < shapePoints.size(); i++){
ctx.newPath();
for(j = 0; j < shapePoints[i].size(); j++){
if(j == 0){
p0 = shapePoints[i][ shapePoints[i].size()-1];
}else{
p0 = shapePoints[i][j-1];
}
p1 = shapePoints[i][j];
ctx.line(p0,p1);
}
ctx.closePath();
ctx.stroke();
}
for(i = 0; i < pSteps; i++){
for(j = 0; j < addedPoints[i].size(); j++){
ctx.newPath();
for(k = 0; k < addedPoints[i][j].size(); k++){
if(k == 0){
p0 = addedPoints[i][j][ addedPoints[i][j].size()-1];
}else{
p0 = addedPoints[i][j][k-1];
}
p1 = addedPoints[i][j][k];
ctx.line(p0,p1);
}
ctx.closePath();
ctx.stroke();
}
}
}
[/code]
Cairoは元々ベクターデータ用の描画エンジンで
画面上に描画もできるのですが、画面に描画しなくても
上記のような書き方でEPS書き出ししてくれました。
保存されたファイルをillustratorで開いてみると…

激重ベクターデータの出来上がり!!
これでOpenCVから印刷データなんかも作れそうでムフフです。
