- 2024/9/6 version 2.3.0 (2024-09-04T19:18:37.222Z)を公開しました。
- 更新履歴はReleasesをご覧ください。
AXNOS Paint(アクノスペイント)は「お絵かき掲示板サイト」での利用を想定したペイントツールです。画像掲示板サービス運営者向けに設計しておりますが、ローカル環境で使用することも可能です。
- JavaScript(Vanilla JS)ライブラリとして提供しています。
- 機能を基本的なものに限定し、知識や熟練を必要としないお絵かき環境を提供します。
- 扱うことができる画像サイズは8×8~600×600です。(※起動オプションで1000×1000まで拡張可能)
- 画像の自動バックアップ機能、一時保存機能を搭載しています。
- ローカルファイルの保存/読込、クリップボードからの貼り付けなどの機能は意図的に排除しています。
- サーバー側で指定した画像を下書きとして読み込む機能を持ちます。
- 投稿用のインターフェースとして、タイトルと本文を入力するフォームを備えています。
- 投稿処理(サーバーとの通信部分)はライブラリに含まれません。ユーザーが独自に組み込む必要があります。
- Edge, Safari, Chrome, Firefox, Opera いずれかの最新版。
- スマートフォンでの利用はサポート対象外とします。
- https://axnospaint.github.io/axnospaint-lib/
こちらのページで動作確認できます。(画像の投稿はできません)
- https://dic.nicovideo.jp/id/5703111
AXNOS Paint:ヘルプ - ニコニコ大百科(外部サイト)
-
reinvented-color-wheel(WTFPL License) https://github.com/luncheon/reinvented-color-wheel
カラーピッカー(改変して使用) -
webpack5(MIT License) https://github.com/webpack/webpack
ビルド用
Releasesから最新版をダウンロードし、/dist/
内の以下のファイルをサーバーに配置してください。
index.html(起動用htmlファイル)
axnospaint-lib-2.x.x.min.js(ビルド済jsファイル。バージョンによってxの数値は変動します)
最小構成の例を以下に示します。提供するサービスに合わせて後述のオプションを指定してください。
<head>
<script defer="defer" src="axnospaint-lib-2.x.x.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
new AXNOSPaint({
bodyId: 'axnospaint_body',
});
});
</script>
</head>
<body>
<div id="axnospaint_body"></div>
</body>
AXNOS Paintのインスタンス作成時に以下のオプションを指定することができます。
bodyId
以外の項目は省略が可能です。省略した場合、初期値が適用されます。
オプション名 | 内容 | 初期値 |
---|---|---|
bodyId | AXNOS Paintの画面を展開するdiv要素のid属性。指定必須 | |
minWidth | キャンバスの最小サイズ(横)。単位はピクセル。最小8~最大1000。 | 8 |
minHeight | キャンバスの最小サイズ(縦)。単位はピクセル。最小8~最大1000。 | 8 |
maxWidth | キャンバスの最大サイズ(横)。単位はピクセル。最小8~最大1000。 | 600 |
maxHeight | キャンバスの最大サイズ(縦)。単位はピクセル。最小8~最大1000。 | 600 |
width | キャンバスの初期サイズ(横)。単位はピクセル。最大最小の範囲外の場合、範囲内に修整されます。 | 317 |
height | キャンバスの初期サイズ(縦)。単位はピクセル。最大最小の範囲外の場合、範囲内に修整されます。 | 317 |
oekakiURL | 下書き機能(1)で使用する画像が配置されているURLパス名。URLパラメータoekaki_id と組み合わせて使用する。詳細は下書き機能の項(1)で解説。 |
|
draftImageFile | 下書き機能(2)で読み込む画像ファイル名。このオプションはURLパラメータを使用しない。詳細は下書き機能の項(2)で解説。 | |
oekakiTimeout | 下書き機能(1)(2)の画像読込タイムアウト時間。単位はミリ秒。 | 15000 |
checkSameBBS | 自動保存からの復元またはロード機能を使用する際、同一の掲示板の画像であるかをチェックします。 詳細は下書き機能使用時の同一掲示板チェックの項で解説。 |
false |
restrictDraftCanvasResizing | 下書き機能(1)または(2)の使用時に、キャンバスサイズの変更ができないように制限します。 | false |
restrictPost | 投稿タブを開けないようにします。何らかの理由で投稿機能を無効化したいときに使用します。 | false |
headerText | ヘッダーのテキスト表示領域に表示する文字列。最大1024文字まで。超過する場合は切り捨て。 「投稿先の掲示板名」が指定されることを想定しています。 |
|
expansionTab | ユーザーが任意で追加することができる拡張タブ定義。 「ヘルプページへのリンク」が指定されることを想定しています。 詳細は拡張タブの項で解説。 |
|
dictionary | ユーザー辞書JSONファイル。 UI表示のカスタマイズに使用します。nullを指定した場合、辞書ファイルを使用しません。 詳細はユーザー辞書の項で解説。 |
|
post | 投稿処理で呼び出すユーザー関数定義。 詳細は投稿機能の項で解説。 |
|
postForm | 投稿用フォームのユーザーカスタマイズ定義。 詳細は投稿用フォームのカスタマイズの項で解説。 |
bodyId
,minWidth
,minHeight
,maxWidth
,maxHeight
,postForm
の指定に誤りがある場合、エラーを表示して強制終了します。- キャンバスの最小~最大サイズの範囲外のセーブデータをロードした場合、エラーを表示してロードを中止します。このケースはサービス運用開始後に最小~最大サイズの設定を変更した場合に発生する可能性があります。
AXNOS Paintは起動時に以下のURLパラメータを受け取ります。
パラメータ名 | 内容 |
---|---|
oekaki_id | oekaki_id .png を下書きとして読み込みます。起動オプションのoekakiURL で画像のパスが指定されている必要があります。 |
oekaki_width | 起動オプションのwidthと同様。同時に指定した場合はURLパラメータの値が優先。 |
oekaki_height | 起動オプションのheightと同様。同時に指定した場合はURLパラメータの値が優先。 |
例)キャンバスサイズ横600、縦400でAXNOS Paintを起動
https://www.axnospaint.jp/index.html?oekaki_width=600&oekaki_height=400
ツール起動時に指定の画像を下書きとして読み込み、初期レイヤーにする機能です。 2通りの指定方法があり、どちらか一方を選択して使用することができます。(※同時に指定した場合、2.が優先されます)
-
URLパラメータ指定(PNG形式専用)
起動オプションoekakiURL
に、画像が配置されているURLパス名を指定する。
起動オプションにoekakiURL
を指定しなかった場合、URLパラメータ指定による読み込み機能は無効になります。new AXNOSPaint({ // 中略 oekakiURL: 'https://www.axnospaint.jp/oekaki/', });
URLパラメータ
oekaki_id
に画像ファイル名(拡張子を除く)を指定して起動する。https://www.axnospaint.jp/index.html?oekaki_id=12345
この時、起動オプション
oekakiURL
で指定されているパスを参照し、https://www.axnospaint.jp/oekaki/12345.png
を読み込みます。 -
起動オプション指定
起動オプションdraftImageFile
に、画像ファイルを指定する。new AXNOSPaint({ // 中略 draftImageFile: 'https://www.axnospaint.jp/oekaki/12345.jpg', });
この方式では、PNG形式以外のファイルも読み込み可能ですが、ツールが出力する画像はPNG形式に変換されます。
下書き機能を使用し、画像の読み込みに成功した場合、以下のルールが適用されます。
- 起動オプション
restrictDraftCanvasResizing
にtrue
を指定している場合、キャンバスサイズの変更機能が使用不可になります。 - 画像サイズに合わせてキャンバスサイズが変更されます。サイズが規定値を超える場合、超過分は切り捨てられます。
- 同一生成元ポリシーに違反する画像を指定した場合、セキュリティエラーが発生します。
- 画像が読み込めなかった場合、エラーメッセージを表示し、新規キャンバスとして起動します。
- 投稿情報の
oekaki_id
またはdraftImageFile
に値が設定されます。(下書きを利用した投稿であることを示す) - 下書き機能を利用したセーブデータは、ロード画面上で、
oekaki_id
または、draftImageFile
で指定されたファイル名が表示されます。
これらのルールは、新規キャンバス作成または別の画像のロードにより、下書き画像との関係性が無くなったタイミングで撤廃されます。 逆に、起動時に下書き機能を使用していなくても、下書き機能を利用したセーブデータをロードしたタイミングでルールが再適用されます。
下書き機能を利用して、一度投稿された画像を(別の投稿者が)他の掲示板へ転載したり、新規と偽って投稿する行為を予防(※完全ではありません)する仕組みです。
起動オプションのcheckSameBBS
にtrue(有効)を指定した場合、適用される機能です。
new AXNOSPaint({
// 中略
checkSameBBS: true,
});
AXNOS Paintでは下書き機能を使用した際に、以下の情報を記憶します。
- URLパス名(
url.pathname
) - 読み込み画像ファイル情報(
oekaki_id
またはdraftImageFile
) - 起動ページの<title>要素の文字列
AXNOS Paintで自動保存からの復元またはロード機能を使用する際、URLパス名が一致しない(=下書き画像が投稿された掲示板とは違う掲示板でロードを行った)場合に、ロードをキャンセルし、同一の掲示板でロードしてもらうことを促すメッセージを表示します。(この時、3.の<title>要素の文字列をメッセージの文言に使用します。この理由から、起動ページの<title>要素には、予め掲示板を一意に特定できるタイトルを指定しておくことが望ましいです)
このルールは下書きを使用しない画像の投稿には適用していません。これは投稿者自身であれば、投稿済みのセーブデータをロードすることで、自由に掲示板を再選択して何度でも再投稿できることを意味します。
仮にここに制限をかけてしまうと「〇〇の掲示板に投稿するつもりだったのに、うっかり△△の掲示板で描き始めてしまった」「〇〇の掲示板で描いている途中に掲示板が削除/閉鎖されてしまった」といったケースで問題が発生することになり、ユーザーの不利益になることが予想されるためです。
投稿者自身による多重投稿については、セーブデータや自動バックアップデータが既に投稿されたものであるかの判定が現実的に困難であり、障害発生で画像が消失してしまうリスクがあるため、こちらについてはAXNOS Paintでは制限を設けず、サービス管理者に対処を一任するものとします。
AXNOS Paint上でユーザーが投稿操作を行ったとき、起動オプションのpost
に指定された関数を呼び出します。この関数内にサーバーとの通信処理を記述することで、サーバー側に投稿情報を渡すことができます。
この時ツール側は、投稿ボタン連打による二重送信を防ぐために、await
でPromise
の処理結果を待機します。通信処理が完了したタイミングで、resolve()
で待機状態を終了させてください。
new AXNOSPaint({
// 中略
post: axnospaint_post,
});
// 投稿処理
function axnospaint_post(postObj) {
return new Promise(resolve => {
// ここにサーバーとの通信処理を記述
console.log(postObj);
alert('サンプルのため、投稿機能は動作しません。');
// resolve()で待機状態が終了し、再び投稿ボタンが押せるようになる(二重送信防止用)
resolve();
});
}
AXNOS Paintはサーバーとのインターフェースとして、以下のメンバ変数をもつObject型データを関数に受け渡します。本文などの項目を入力必須にしたい場合は、次項で解説する起動オプションのisInputRequired
にtrue
を指定してください。
メンバ変数名 | 内容 |
---|---|
strName | 投稿者名。trim()メソッドで文字列の両端の空白を削除済。デフォルト設定では省略可 |
strTitle | タイトル。trim()メソッドで文字列の両端の空白を削除済。デフォルト設定では省略可 |
strMessage | 本文。trim()メソッドで文字列の両端の空白を削除済。デフォルト設定では省略可 |
strWatchList | ウォッチリストに登録 チェックボックスが選択されている場合't'、それ以外は''(空文字)とする。 |
oekaki_id | 下書き機能(1)を使用した場合に付与される情報。未使用時はNULL。(URLパラメータで指定したoekaki_id の内容の転記。ただし、AXNOSPaint使用中の操作で更新される場合があります。 |
draftImageFile | 下書き機能(2)を使用した場合に付与される情報。未使用時はNULL。(起動オプションで指定したdraftImageFile の内容の転記。ただし、AXNOSPaint使用中の操作で更新される場合があります。 |
strEncodeImg | 投稿するpng画像のdata URI toDataURL('image/png')でエンコードした後、replace('data:image/png;base64,', '')でヘッダ部分を削除したもの。 AXNOS Paint側の設定により、背景透過pngとなる場合もある。 |
【重要】
AXNOS Paintは、キャンバスサイズの変更機能、画像のセーブ/ロード機能をもつ関係上、起動時に指定したURLパラメータと実際に投稿される画像の情報が一致しない場合が発生します。
(例:317×317の画像ファイルを下描きとして描き始めたが、途中で既にセーブしてあったキャンバスサイズ400×400の別の画像データをロードして投稿した等)
そのため、投稿処理の中ではAXNOS Paintが受け渡す投稿情報オブジェクトを参照することを前提とし、以下の操作は想定外の動作を引き起こす原因となるため絶対に行わないでください。
- ❌投稿処理内でURLパラメータの値を参照する
- ❌「下書き機能」を使用した投稿であるかの情報を、サーバー側で事前に投稿処理に埋め込む
- ❌サーバー側でURLパラメータ(referer)と投稿画像との整合性チェックを行う
起動オプションのpostForm
で、投稿用フォームの表示/非表示、入力必須の有無、最大文字数、プレースホルダーのカスタマイズが可能です。
以下に設定例を示します。
new AXNOSPaint({
// 中略
postForm: {
// 投稿フォーム
input: {
isDisplay: true,
// 投稿者名
strName: {
isDisplay: true,
isInputRequired: false,
maxLength: 32,
placeholder: 'ななしのよっしん',
},
// タイトル
strTitle: {
isDisplay: true,
isInputRequired: false,
maxLength: 32,
placeholder: '',
},
// 本文
strMessage: {
isDisplay: true,
isInputRequired: true,
maxLength: 1024,
placeholder: '本文を入力してください。',
},
// ウォッチリスト登録
strWatchList: {
isDisplay: true,
},
},
// 注意事項
notice: {
isDisplay: true,
// 文章はユーザー辞書を使用して書き換えが可能
},
},
});
オプション名 | 内容 | 初期値 |
---|---|---|
isDisplay | 項目表示フラグ。false を指定すると非表示になり、isInputRequired の入力チェックも実施しない。 |
true |
isInputRequired | 入力必須フラグ。true を指定すると項目に「必須」の文字が表示される。未入力の場合、入力を促すメッセージを表示する。 |
false |
maxLength | 入力可能な最大文字数。1~1024の範囲内で指定する。 | ※1 |
placeholder | プレースホルダーとして表示する文字列。要素のplaceholder属性に設定される。 | 空文字列 |
※1:未指定時の初期値は、投稿者名とタイトルは32文字、本文は1024文字。
- 投稿フォームを使用しない場合は
input
のisDisplay
をfalse
(非表示)にしてください。投稿者名、タイトル、本文、ウォッチリスト登録のすべてが非表示になります。 - 非表示項目は、入力必須フラグが無効になります。
- 指定を省略した項目は、初期値が適用されます。
- 不正な値が指定された場合、エラーメッセージを表示して強制終了します。
AXNOS Paintに、ユーザー独自のタブを1つ追加する機能です。「リンク表示」「関数呼び出し」の2通りの使用方法があります。
- リンク表示(推奨)
name
で指定された名前のタブを追加し、クリックすると別タブでlink
で指定されたURLのページを開きます。また、タブにポインタを重ねた時、msg
で指定されたガイドメッセージを左下に表示します。
new AXNOSPaint({
// 中略
expansionTab: {
name: 'ヘルプ',
msg: '説明書(ニコニコ大百科のAXNOS Paint:ヘルプの記事)を別タブで開きます。',
link: 'https://dic.nicovideo.jp/id/5703111',
},
});
- 関数呼び出し
name
で指定された名前のタブを追加し、クリックするとfunction
で指定された関数を呼び出します。また、タブにポインタを重ねた時、msg
で指定されたガイドメッセージを左下に表示します。
AXNOS Paintのページ内でユーザー独自の処理を行う必要がある場合に使用します。
new AXNOSPaint({
// 中略
expansionTab: {
name: 'お知らせ',
msg: 'お知らせ:運営からのお知らせを表示します。',
function: function () {
alert('運営からのお知らせです。');
}
},
});
AXNOS Paintが表示している一部の単語を、ユーザーが指定した単語に置換する機能です。
- 提供するサービスに合わせて、ボタンのラベルや注意事項などを、より適切なメッセージに変更することできます。
- 多言語対応としても利用できます。(データはユーザーが用意する必要があります)
- 特定の単語のみ置換可能で、設定画面や各種メッセージ等には対応していません。
- 辞書ファイルのサンプルと作成方法はこちら(動作無保証)
辞書ファイルをサーバーに配置し、起動オプションdictionary
にファイルパスを指定する。
new AXNOSPaint({
// 中略
dictionary: 'mydic.json',
});
AXNOSPaintでは、ライブラリ利用者がページ遷移を制御できるようにする為、Window:beforeunloadイベント
を設定していません。
必要に応じて以下のようなイベントハンドラを設定してください。
// 設定
window.onbeforeunload = function (event) {
event.preventDefault();
event.returnValue = "";
}
// 解除(投稿処理時)
window.onbeforeunload = null;
AXNOS Paintを起動するページ内で任意の情報(緊急告知、メンテナンス予告など)を表示する必要がある場合、 AXNOS Paintを展開するdiv要素の前または後(あるいは両方)にdiv要素を追加することで、その領域内を任意に使用することができます。 ただし、ペイントツールとしての使用感を著しく低下させる恐れがあるため、基本的には使用を推奨しません。 通常はAXNOS Paintが標準で提供しているお知らせ領域の利用を推奨します。
例)
<body>
<div>
2024/xx/xx 緊急メンテナンスのお知らせ 20:00~24:00の間、サービスをご利用いただくことができません。
</div>
<div id="axnospaint_body"></div>
</body>
webpack5を使用し、.pngファイルや.cssファイルを含めた全ファイルを1つの.jsファイルにバンドルします。
webpack.config.js : 開発用webpack設定ファイル。.jsファイル出力用。
webpack.prod.js : プロダクションビルド用webpack設定ファイル。コメントなどを削除したmin.jsファイル出力用。
通常版とWebデモ版が存在します。
通常版プロダクションビルド
npm run prod
- ファイルの出力先は
/dist
- ファイル名は
index.html
,axnospaint-lib-2.x.x.min.js
(バージョン番号はpackage.jsonに依存します)
Webデモ版プロダクションビルド
npm run prod-demo
- ファイルの出力先は
/docs/latest
- ファイル名は
index.html
,axnospaint-lib-demo-2.x.x.min.js
(バージョン番号はpackage.jsonに依存します) - Webデモ版にはマスコット機能が追加されます。
マスコットキャラがペイントツールの機能について紹介を行う機能が追加されます。
拡張機能として./extensions/mascot/の中にデータが配置されています。Webデモ版のビルドを行った場合、.jsファイルにデータが取り込まれ機能が有効になります。
AXNOS PaintはブラウザのindexedDB領域(DB名:axnospaint_db1
)を使用して、画像のセーブロード、自動バックアップ、ユーザー設定情報の保存を行います。
indexedDBが使用できない環境(プライベートブラウジングモード使用時など)の場合、起動時に警告が表示され、関連する機能が動作しなくなります。
localStorage、Cookieは使用していません。
機能や役割を識別するための名前として所属名を定義しています。
所属名 | 内容 |
---|---|
main | メイン領域 |
canvas | キャンバスタブ内のコンテンツ |
pen | ペンツールウィンドウ |
penmode | ペン種別選択サブウィンドウ |
layer | レイヤーウィンドウ |
renamelayer | レイヤー名変更サブウィンドウ |
palette | パレットウィンドウ |
makecolor | 色作成ウィンドウ |
tool | 補助ツールウィンドウ |
saveload | セーブ/ロード/自動保存サブウィンドウ |
gridconfig | 補助線の色変更サブウィンドウ |
custom | カスタムボタンウィンドウ |
mascot | マスコット表示用領域 |
config | 設定タブ内のコンテンツ |
post | 投稿タブ内のコンテンツ |
footer | フッター領域 |
AXNOS Paintでは、先頭にaxp_を付与したid名を使用します。 競合を避けるためにaxp_で始まるid名を同時に使用しないように留意してください。
axp_所属名
axp_所属名_要素名_任意の識別名
例:axp_pen(ペンツールウィンドウ)
例:axp_pen_form_penSize(ペンツールウィンドウ内の<form>要素、ペンの太さ調整用)
例:axp_layer_button_create(レイヤーウィンドウ内の<button>要素、新規ボタン)
- 「axp_所属名」のidをもつ要素は、その所属の親divを意味するものとします。
- 要素名はdiv、span、form、labelなどを指します。
- input要素の場合は、type属性を要素名として扱います。(例:range、checkbox、number)
- penmodeで命名規則例外あり
AXNOS Paintでは、先頭にaxpc_を付与したclass名を使用します。 競合を避けるためにaxpc_で始まるclass名を同時に使用しないように留意してください。
axpc_分類名
axpc_分類名_任意の識別名
axpc_所属名_任意の識別名
分類名 | 役割 |
---|---|
button | ボタン |
checkbox | チェックボックス |
icon | アイコン画像 |
radio | ラジオボタン生成用。JavaScriptで <span> を <input type"radio"> に展開する。 |
range | レンジスライダー |
window | ツールウィンドウ制御用css |
toggle | トグルスイッチ風チェックボックス |
キャンバス画面の要素が重なった場合の表示順序を制御するz-indexは以下の通りです。値が大きい要素ほど前面に表示されます。
値 | 要素 |
---|---|
100 | キャンバス |
600 | 補助線 |
700 | ポインタ位置に表示するペンの太さ表示 |
800 | ポインタ座標表示用領域 |
900 | デバッグ情報表示 |
1000~ | 各種ツールウィンドウ(最後に操作したウィンドウが前面になるように変動) |
2000 | サブウィンドウ |
3000 | マスコット |
5000 | セーブ/ロード画面 |
6000 | ハンバーガーメニュー |
10000 | アラート(alert() で表示されるポップアップ) |
(c) 2022 「悪の巣」部屋番号13番:「趣味の悪い大衆酒場[Mad end dance hall]」
Licensed under MPL 2.0