今回はMacの透過スクリーンセーバを自作する方法をまとめます.
今更感はありますがやったことなかったので,,,
なぜ透過かというとその方がかっこいいからです.

Processingのスケッチをスクリーンセーバにする

ProcessingのスケッチをScriptSaverを使ってスクリーンセーバにします.
ScriptSaverはスクリーンセーバ実行時に任意にAppleScriptを実行するソフトです.

手順としては以下の通り

- Processingのスケッチをネイティブアプリとして書き出す
- ScriptSaverを使って,スクリーンセーバ実行時にProcessingのスケッチを立ち上げるようにする

まず,スクリーンセーバに設定したいスケッチを用意してください.

その際の注意点として,

void mousePressed() {
  exit();
}

void mouseMoved(){
  exit();
}

void keyPressed(){
  exit();
}

等の終了処理を記載すること,スケッチのサイズを全画面にすることに注意してください.
また,タイトルバーを非表示にして常に最前面に表示するために,
void setup()の前当たりに

public void init(){
  frame.removeNotify();
  frame.setUndecorated(true);
  frame.addNotify();
  super.init();
}

を記載してください.


FileからExport Applicationを選び,書き出します.
(通常はここでFullScreenモードにチェックを入れますが,後に記載する透過スクリーンセーバをつくる際は表示がずれてしまいます.)
ソースコードのあるディレクトリのapplication.macosx以下に実行ファイルが書き出されるので,
それをApplicationsディレクトリに移動させます.名前は”MyScreenSaver”等にしておきましょう.



続いてScriptSaverのサイトからソフトをダウンロード,インストールします.
下記のスクリプトをScreenSaver.scptというファイル名で作成し,Applicationsディレクトリに保存します.
“MyScreenSaver”のところは先の実行ファイルに名付けたものにしてください.

tell application "ScreenSaverEngine" to quit
tell application "MyScreenSaver"
  activate
end tell

“システム環境設定”から”デスクトップとスクリーンセーバ”を開き,ScriptSaverをスクリーンセーバに設定します.
また,”オプション”ボタンをクリックし,Activation ScriptのLocationを”/Applications/ScreenSaver.scpt”に設定します.

設定は以上です.”テスト”ボタンをを押すか,一定時間待ってスクリーンセーバが実行されるのを確認してください.

透過スクリーンセーバを作る

上記の手順をもう一歩進めて透過なスクリーンセーバを作ってみましょう.
もともと液晶の焼きつきを防ぐためのものなのは承知の上ですが,そっちのほうがかっこいいので

そもそもQuartz Composerを使えば,もともと透過機能が実装されているらしいのですが,バグも多いそうなので,
今回はスケッチ実行時にスクリーンショットを取り,それを背景として使用する疑似透過スクリーンセーバを作ります.

PImage image;

void setup() {
  img=screenshot();
  size(img.width,img.height);
  image(img,0,0,width,height);
}

PImage screenshot() {//スクショをPImage型で保存
  try {
    Robot robot = new Robot();
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    BufferedImage img = robot.createScreenCapture(new Rectangle(screenSize));
    return b2p(img);
  }
  catch(Exception e) {
  }
  return null;
}

PImage b2p(BufferedImage img1) {//BufferedImageをPImageに変更
  PImage img2 = createImage(img1.getWidth(), img1.getHeight(), ARGB);
  Raster r=img1.getRaster(); 
  for (int i = 0; i < img2.width; i++) {
    for (int j = 0; j < img2.height; j++) {
      int data[]=r.getPixel(i,j,new int[4]);
      img2.pixels[i + j * img2.width] = img1.getRGB(i, j);
    }
  }
  img2.updatePixels();
  return img2;
} 
 

上記のコードでimageにスクリーンショットが確保されるので,draw関数内で描画してあげれば,下のように擬似的な透過スクリーンセーバを作ることができます

Screenshot 2015-05-02 20.28.44 これが...

Screenshot 2015-05-02 20.28.53 こうなる "にゃー"

色々遊んでみてください.


参考サイト: http://tumblr.ondra.cc/post/3028064141/processing-screen-saver
Share Button

透過スクリーンセーバを作ろう (Mac)

<2015/05/02>