PNG ファイルから Painter のミキサーデータを作成するスクリプトの内容は以下のとおり。PHP では読み込んだ画像のアルファ値も取得できますが、それは 0 から 127 の範囲で、Painter のミキサーのアルファ値は 0 から 255 で、しかも完全に透明なのが最大値か最小値かという部分が反対のようなので、適当に変換しました。PHP の pack 関数は使い方がよくわからないので、最後は試行錯誤で……。

いちおう動けばよい、という目的で作成したものなので、作者免責でご使用ください。また、問題点をみつけたときは、伝言板連絡フォーム でご指摘ください。


<?php
// Image to Painter Mixer Data Converter - kaburaya April 2011
// 表示位置は開いたときに内容を見失わないように左上端にした。デフォルトは中央らしい。

$script $_SERVER['PHP_SELF'];
$userfile_temp $_FILES['userfile']['tmp_name'];
$userfile_type $_FILES['userfile']['type'];
$newfile $_FILES['userfile']['name'];
$newfile substr($newfile0strrpos($newfile'.')) . '.mxs';
//$title = 'Image to Painter Mixer Data Converter';
$title 'PNG ファイルを Painter のミキサーデータに変換';
$max_size 5000000// in bytes
// ミキサー背景色設定 ( 0 - 255 )
$bg_red 220;
$bg_green 220;
$bg_blue 200;

function 
print_error($error_message) {
    print 
"<p>$error_message</p>";
}

function 
print_footer() {
print<<<_FOOTER_
<br />
<form class="right" action="
$script" method="post">
&bull; 他のファイルも変換する &raquo; 
<input type="submit" value="Again!" />
</form>
</div>
</div>
</body>
</html>
_FOOTER_;
exit;
}

header('Content-type: text/html');
print<<<_HEADER_
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>
$title</title>
<style type="text/css">
div#container {text-align: center;}
div#main {float: auto; text-align: left; margin: 50px auto; width: 550px; line-height: 150%;}
.right {float: right; text-align: right;}
h1 {font-size: 100%; padding: 6px 8px; background-color: #dde6dd; border-style: dotted none; border-width: 1px; border-color: #80a080;}
p ul {margin: 2px; padding: 0;}
p.note {padding-left: 20px; font-size: 90%; color: firebrick;}
form.framed {margin: 12px 0 ; padding: 12px; border: 1px dotted #80a080; background-color: #fafff0; }
input {margin: 4px 0}
</style>
</head>
<body>
<div id="container">
<div id="main">

_HEADER_;

// アップロード動作をしたか
if ($_POST['posted']) {
// アップロード完了存在確認
if (!$userfile_temp) {
    
$error_message "<span style=\"font-weight: bold; color: red;\">アップロードが完了しませんでした。</span> ファイルサイズの上限は $max_size bytes です。";
    
print_error($error_message);
    
print_footer();
} else {
// ファイルタイプにより分岐
if ($userfile_type == "image/png") {
    
$image = @imagecreatefrompng($userfile_temp);
    if(!
$image) return FALSE;
    
$height imagesy($image);
    
$width imagesx($image);
} else {
    
$error_message 'アップロードされたファイルが PNG ではないので、処理できません。';
    
print_error($error_message);
    
print_footer();
}

$target fopen($newfile'w');

$data = <<<_MIXER_
Mixer File Version: 1
Scale: 1.000000,  PanX: 0.000000, PanY: 0.000000
Mixer Background -  R: 
$bg_red, G: $bg_green, B, $bg_blue
Mixer Width: 
$width,  Mixer Height: $height
Mixer Image Binary data (AARRGGBB):

_MIXER_;

fwrite($target$data);

for (
$y=0$y<$height$y++) {
    for(
$x=0$x<$width$x++) {
        
$pixel imagecolorat($image$x$y);
        
$a = ($pixel 0x7F000000) >> 24;
        
$a 127 $a// invert alpha
        
$a $a * (255 127);
        
$r = ($pixel >> 16) & 0xFF;
        
$g = ($pixel >> 8) & 0xFF;
        
$b $pixel 0xFF;
        
$data pack("c*"$a$r$g$b);
        
fwrite($target$data);
    }
}

fclose($target);
imagedestroy($image);
$result number_format(filesize($newfile));

// 変換後の表示
print "<p>$result bytes の <a href=\"$newfile\">ファイル</a> を生成しました。ダウンロードしてローカル保存してください。</p>\n";
print_footer();
}
} else {
// 送信動作がまだなら初期画面を表示
print<<<_DIALOG_
<h1>$title</h1>

<ul>
<li>Corel Painter ver. 8.1 以降の <strong>ミキサー</strong> ファイル(*.xms)を PNG ファイルから生成するスクリプトです。PNG ファイルの <strong>透過部分</strong> がミキサーの背景色部分(絵具の乗っていない部分)になります。</li>
<li><strong>背景色</strong> はミキサー内から変更できます。</li>
<li>受付ファイルサイズ上限は 
$max_size バイトです。</li>
<li>左上に余白を作りたいときは、もとの PNG ファイルで透明部分をあけてください。</li>
</ul>

<form class="framed" action="
$script" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="
$max_size" />
<input type="hidden" name="posted" value="yes" />
<input type="file" name="userfile" accept="image/png" size="60" />&nbsp; 
<input type="submit" value="変換" />
</form>

<p class="note">ミキサーデータは Painter から直接開くのではなく、ミキサーパレット内のメニューから読み込む必要があります。現在のミキサーの内容は新しく読み込んだデータで上書きされますので、保存しておきたい場合はミキサーのメニューから保存した上で、別のデータを読み込んでください。</p>

</div>
</div>
</body>
<html>
_DIALOG_;
exit;
}
?>

(2011/04/02)