Giter VIP home page Giter VIP logo

megamoji's Introduction

http://zk-phi.github.io/MEGAMOJI

開発者向け

新しいアイデアや新しいクソアニメを実装したらぜひ PR ください!

開発環境

dev server

npm install
npm run start

するとサーバーが立ち上がります。 https://localhost:8080 で確認できます。

ソースをいじるとすぐに反映されます。

M1 Mac で npm install にコケる場合

node-canvas パッケージが arm64 に対応していないのが原因の可能性があります。

x86_64 な node を入れてみてください。

asdf でインストールする例:

arch -x86_64 asdf install nodejs <version>

ビルド

npm run build

ビルドすると ./dist ができます。そのまま静的サイトとしてデプロイできます。

lint

npm run lint

コーディングスタイルの揺れなどを自動検出します。

npm run fix

で大部分は自動修正できます。

プルリクを送る前に走らせておくのがおすすめです。

Workflows

GitHub Actions を使って自動でビルドしたり、 lint をかけたりするようにしてあります。

  • lint … master を push したときに npm run lint
  • lint-pr … プルリクを作ったときに reviewdog 経由で eslint, stylelint を回す
  • build … master を push したときに npm run lint して gh-pages に push

ビルド時、 GitHub Secrets に ROLLBAR_TOKENGA4_TOKEN をセットしておくと、 エラー収集やユーザー分析ができます。

ディレクトリ構成

  • src/
    • animations/ … 個別のアニメーションの実装が入っています
    • components/ … UI 部品が入っています
    • constants/ … 定数類が入っています
    • effects/ … エフェクトの実装が入っています
    • filters/ … フィルタの実装が入っています
    • fonts/ … web font が入っています
    • parts/ … 「パーツから選ぶ」で使用するパーツ画像が入っています
    • samples/ … チュートリアルで使っているサンプルが入っています
    • shaders/ … WebGL エフェクトで使うフラグメントシェーダーが入っています
    • utils/ … 便利関数たちが入っています
    • webgleffects/ … WebGL エフェクトの実装が入っています
    • megamoji.js … エントリポイントです
    • types.js … エフェクトなどの型定義が入っています
  • static/ … html など特にビルドせずにそのまま配信できるものが入っています
  • resources/ … ドキュメントで使う画像などアプリと関係ないものが雑に入っています

フィルタの追加

src/constants/filters.js に一覧があります。

フィルタの実体は1引数の関数です。

HTMLImageElement が渡ってくるので、適宜画像処理をして、できあがった画像を BlobURL で返します。

エフェクトの追加

src/constants/effects.js に一覧があります。

エフェクトの実体は5引数の関数です:

keyframe
アニメーションの進行具合 (0.0 ~ 1.0 の浮動小数)
ctx
CanvasRenderingContext2D のオブジェクト
cellWidth
canvas の横幅
cellHeight
canvas の高さ

背景が塗りつぶされたあと、 drawImage される直前の ctx が渡ってくる ので、 transform, filter, clip など好みの変形をセットしてくださ い。 エフェクトは複数併用することを想定しているので、 setTransform など他のエフェクトが加えた効果を上書きしてしまうようなメソッドを呼ぶ ことは避けてください。

また作成した絵文字がアニメーション無効の環境でも快適に使えるよう、 少なくとも1フレーム目にはなんらか意味のある画像が描画されるように 調整してください。アニメーション無効の環境でどう表示されるかを確認 したい場合は、「効果をつける」の「職人モード>イージング」で 「1フレーム目固定」を選択してください。

渡ってくる canvas は、最終的に絵文字としてレンダーされるものの4倍 (縦横それぞれ2倍)の大きさになっています。

+--------+
|        | <- cellHeight / 4 の余白
| +----+ |
| |    | | <- cellHeight / 2 の描画エリア
| |    | |    最終的に絵文字に使われる部分
| +----+ |
|        | <- cellHeight / 4 の余白
+--------+

たとえば絵文字を上にスライドアウトさせたい場合、 cellHeight / 2 だけ (cellHeight ではなく) 上に translate してあげれば十分です

余白をトリミングする前の canvas の様子が見たい場合は、「効果をつける」 の「職人モード>開発者モード」にある「余白を切らない」を有効にして ください。

===

仕様の背景:

びよんびよん などの拡大縮小 (特に縮小) や回転を伴うエフェクトを組み 合わせると、本来絵文字として使われる範囲外の、余白部分までチラ見えして しまうことがあります。このような場合でもアニメーションを綺麗に見せるた め、内部ではいったん、最終的に絵文字に使われる範囲より外まではみ出して レンダリングしてから、あとで余白をカットしています。

わかりづらい仕様なのでなんとかしたい気持ちはありますが、上手い方法が思 いついていないです。

アニメーションの追加

src/constants/animations.js に一覧があります。

アニメーションの実体は5引数の関数です:

keyframe
(effect_ と同様)
ctx
(effect_ と同様)
image
アニメーションさせたい元画像
offsetH
元画像の描画したい範囲(左端)
offsetV
元画像の描画したい範囲(上端)
width
元画像の描画したい範囲 (幅)
height
元画像の描画したい範囲 (高さ)
cellWidth
(effect_ と同様)
cellHeight
(effect_ と同様)

アニメーションは、渡ってきた canvas に対して、 ctx.drawImage などを 使って実際に画像 image をレンダリングするします。ユーザーの設定した トリミング範囲が offsetH, offsetV, width, height として渡ってくるので、 通常、 canvas に対するレンダリングは以下の形になります (効果の一環 として、あえてそうしないことは可能です):

ctx.drawImage(image, offsetH, offsetV, width, height, ...);

アニメーションに渡される canvas もエフェクトと同様、実際に絵文字として 出力されるものの4倍の大きさを持っています。

+--------+
|        | <- cellHeight / 4 の余白
| +----+ |
| |    | | <- cellHeight / 2 の描画エリア
| |    | |    最終的に絵文字に使われる部分
| +----+ |
|        | <- cellHeight / 4 の余白
+--------+

たとえば、なにもしないアニメーション (ただ画面の**に、通常のサイズで 絵文字を描画するだけ) の実装は次のようになります:

ctx.drawImage(..., cellWidth / 4, cellHeight / 4, cellWidth / 2, cellHeight / 2);

エフェクトと比べると、レンダリング方法を自由に実装できる点で自由度が高 いです (2つ重ねてレンダリングするなど、単純な変形だけでは実現できない 効果を実装できる)。ただし、他のアニメーションと組み合わせることはでき なくなってしまうので、エフェクトとして同じ効果を実装することができない か、一度は検討してみてください。

またエフェクトと同様に、作成した絵文字がアニメーション無効の環境でも 快適に使えるよう配慮してください。

WebGL エフェクトの追加

src/constants/webgleffects.js に一覧があります。

Canvas の基本的な変形機能だけでは実装できないエフェクトを WebGL で実装できます。

WebGL エフェクトの実体は4引数の関数です:

  • keyframe
  • cellWidth
  • cellHeight

シェーダをロードして、適切なパラメータをセットして返してください。

// 例
import { webglLoadEffectShader, webglSetVec2 } from '../utils/webgl';
import fooShader from '../shaders/foo';
function webglZoom (keyframe, _w, _h, args) {
  const program = webglLoadEffectShader(fooShader);
  webglSetVec2(program, 'center', keyframe, 0.5);
  return program;
}

シェーダーは src/shaders にあります (追加しても OK です)。

追加する場合は webglEffectShader というラッパー関数があるので、これに 生の GLSL コードを投げつけてください。

const myShader = webglEffectShader(`
  <GLSL code>
`);

よく使う関数 (疑似乱数など) は src/shaders/utils にあります。

画像は例によって4倍サイズでレンダーされます。

また例によって、作成した絵文字がアニメーション無効の環境でも快適に使える よう配慮してください。

フォントの追加

読み込みが遅くなるので慎重に。

以下のフォントは入れないことにしています:

  • アイコンサイズに縮小すると読めない
  • 収録漢字が少ない
  • 他のフォントと使いたい場面が被る

フォントのライセンスをよく確認 (再配布可?改変 (woff 化) 可?) した上で、 woff 化したフォントを src/fonts に入れてください。

SIL Open Font License でライセンスされたフォントのうち、ライセンスに 「with Reserved Font Name …」が含まれているものは原則使用しません (woff 化にあたってフォント名を変える必要があり、面倒なため)。

woff 化にはこれ https://github.com/zk-phi/woff2sfnt-sfnt2woff を使っています。

node sfnt2woff.js hoge.ttf hoge.woff

フォントを入れたら2つのファイルを更新してください。

  • src/constants/fonts.ts
  • LICENSE.markdown

ライセンス表記時の作者名は、アカウント名などから適当に持ってくるのではなく、 なるべく正式な表記を探してコピーしてください。

megamoji's People

Contributors

dependabot[bot] avatar finearchs avatar ginjake avatar hata6502 avatar k725 avatar miyakeryo avatar negibouze avatar ymnder avatar zk-phi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

megamoji's Issues

「俺」(ゴシック/極太)のアウトラインにトゲが生える

ゴシック/極太

にんべんの上にトゲが生えます。

設定は次の通りです。

  • フォント:ゴシック/極太
  • テキスト:
  • 色:プリセットの黄色(#FFDA00)
  • アウトライン:プリセットの黒(#000000)
  • 効果をつける:(特に無し)

「俺」以外にも、同条件では「僕」「黎」「點」「蛾」などの字で様々なトゲが生えます。
また、「ゴシック/極太」以外のフォントでも生えるものは生えます。
閲覧環境はWindows、Chromeです。

miterLimit プロパティとやらで解決するかもしれません。
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/miterLimit

チカチカの点滅速度(?)

素敵なアプリありがとうございます。
チカチカのフィルターですが、点滅速度(?)を二段階か多段階にできないでしょうか。
一番下の画像と同じにようにしたく・・

自分でも可能ならPR出してみたいところですが、どこから調べればいいのやら・・

image

アス比をいじるとバーごと伸び縮みしてしまう

環境:Chrome、スマホ(Android)

テキスト→効果をつける→職人モード からアス比をいじっていると、1:5を超えたあたりから絵文字の横幅がUIの横幅を超え、アス比変更に連動してUIが伸縮するようになります。
アス比調整バーもこれに追随するため、かなり編集のしづらい状態になります。
恐らくスマホに限った挙動ですが、可能であれば修正をお願いします。

「ドヘタ字 J」がライセンス上使えないが、使える状態になってしまっている

「ドヘタ字 J」のBoothに、

※制作頒布元であるかえるぴょん工房が公式に行うもの以外の下記行為は禁止とさせていただきます。
・フォントファイルの改変・複製・販売・二次配布
LINE絵文字など文字主体の制作物の配布・販売
・フォントを使用した制作物の商標登録、意匠登録
・作者の許可なく素材集などへ収録して販売すること

という記述が追加されていました。
Wayback Machineを見ると、少なくとも2023/4/10以降に追加されたようです。
ダウンロードデータのreadme.txtにはそのような記述はなく、やや書いてあることが異なるようですが、絵文字として自由に利用できるフォントだけを収録するという方針であれば取り除いたほうがいいかもしれません。

横長絵文字のサンプル表示

現在の絵文字プレビューのサンプル表示では、横に長い絵文字が32*32pxまで縮小されて表示されます。
しかし、Misskeyなどのプラットフォームでは横に長い絵文字をそのまま横に長く表示することができます。
このような用途で使う用に、サンプル表示で大きさをキープできる機能が欲しいです。
よろしくお願いします。

[機能リクエスト]前回の設定を保存したい

素晴らしいwebアプリを開発してくださってありがとうございます!
私自身毎週何かしらのスタンプをMEGAMOJIで作ってはSlackに追加しており、おかげさまで絵文字を生成するハードルがさがり絵文字を使ったコミュニケーションが大変捗っています。
前置きが長くなりましたがタイトルのような機能を取り込んでいただきたいと思っています。
取り込んでもいいと思っていただけるようであればPRを作らせていただきますので返信いただけますと幸いです!🙇‍♂️

簡単ですが以下詳細です。

課題感

毎回似たような設定値で絵文字を作成するのが面倒(背景色の透過・フォントなど)

解決策

絵文字の保存時に設定値をlocalstorageに保存し、ページ読み込み時にそこから設定を読み出す

カラーコードを文字列で指定できない

現在、詳細オプション内で色を好きに指定できる機能がありますが、目的のカラーコードがあっても頑張ってカラーピッカーを操作して選ぶ必要があります。せめてHTMLカラーコードを、できればrgbでも指定できるようにしたい

[バグレポート] テキスト>詳細オプション>色の変更でクラッシュする

現象

スクリーンショット 2022-05-28 7 39 59

再現手順

  1. なんでもいいので文字を入力
  2. サンプル表示
  3. 「効果を付ける」からアニメーションや特殊効果を付与(アニメーションgifにするとクラッシュまで早くなりました)
  4. テキスト設定に戻り「詳細オプション」からカラーピッカーで色を変更(ぐるぐる色変えると特にクラッシュまで早いです)
  5. 上記画像の通りクラッシュ後のページが表示される

経緯

アニメーションを設定して、グラデーションやコントラストの色調整(目まぐるしく色を変えたりはせず、ぽちぽちと触っていただけ)をしていたらクラッシュし、軽く手順を調べたところ色の変更が複数リアルタイムに反映されることから処理が重くなりクラッシュしているようでした。

スクリーンショット 2022-05-28 7 46 59

謝辞

楽しいツールを作ってくださってありがとうございます!
いつも利用させていただいています!

画像ファイルのサイズ

面白いツールをありがとうございます。
画像を元に生成して、登録をこころみましたが、
Your file must be less than 64KB in size.
となってしまい、slack emoji に登録できませんでした。
できれば、64 KB以下になるように自動的に圧縮して軽量化できるようにしていただけると
もっと使いやすくなると思います。
ご検討よろしくお願い致します。

入力したテキストをファイル名でも使って、SlackやMisskeyで絵文字名を読みやすくしたい

SlackやMisskeyでは、絵文字を見れない環境でも「絵文字名」を表示できます。
しかし英語やローマ字で絵文字名を登録する傾向もあり、パッと見でどんな意味か分からないことがあります。
Image from Gyazo

SlackやMisskeyは、日本語で絵文字名を登録できます。

  • Slackでは、ファイル名がデフォルトの絵文字名に使われます。
    • Image from Gyazo
  • Misskeyでは、登録する絵文字名とファイル名を合わせる必要があります。

現在、MEGAMOJIで作成した絵文字のファイル名はmegamoji.pngになります。
入力したテキストをファイル名でも使えば、
絵文字の意味をそのまま表現した「絵文字名」を登録しやすくなると思います。

画像のサイズ

素敵な、治安の悪いSlack Emojiジェネレーターありがとうございます🔞

主に文字列から作成してきて今までとあるサイト(http://www.mojimaru.com/mojiga/ )を使ってましたが、全然イケてないということでこちらに目をつけました。
こちらで文字列から生成しようとするとサイズが256x256になるのでリサイズの手間がかかってしまいます。
こちらからPRを出したいと思います。
よろしくお願いします。

Images rendered onto a white background

Even if my source image has a transparent background, the resulting GIF is rendered on white. If we could find a way to render these GIFs onto a (mostly) transparent background, the emojis would be useful in applications where the background is not always white (like Discord, or perhaps future versions of Slack).

Original
lego_angry_minifig

Processed
lego_angry_rattle

lint のルールとエフェクトのチェックボックス周り

エフェクトのチェックボックス周り、 value が関数になっているの結構怪しい。

実際、 lint のルールに適応するために webglEffects.js をイジる (varconst にして、 WEBGL_EFFECTSfn をシンボルじゃなくエフェクト実体にする) とチェックボックスが変な動きする。

効果をつけるタブはオプション機能として扱いたい

現在MEGAMOJIは4つのタブから構成されていますが、すべての機能が同じタブで扱われていることにより情報構造が分かりにくいように思います。

テキストから作る・ファイルから選ぶ・パーツから選ぶ
の3機能は絵文字をcreate / importする機能で
効果をつける
は3機能のoutputをemphasizeする機能であると分類できます。

UIUXを改善するため次の修正を行いたいです。

案①タブにアイコンをつける

現在 効果をつける タブだけ★のアイコンがついています。
他のタブにもそれぞれ、createを示すようなアイコンを付与します。
ref: https://material.io/resources/icons/?icon=create&style=sharp

add-icon

案②結果の下に遷移ボタンを置く

結果が表示されるカードの下に 効果をつける タブを置きます。
結果を見た後に移動するフローがより簡便になります。

add-effect

案③3機能をポップアップとして表示する

効果をつけるをメイン機能とみなした強い変更です。
最初に必ずcreate / importを行ってもらい、じっくり効果をつけてもらうという流れになります。

気をつけていることの言語化

  • 一番大事「サクッと感」=「こんな簡単にこんないかついスタンプができるの?!」感

    • 手入力をなるべく減らして、ぽちぽち選ぶだけでなんかすごいのができるようにする
    • 「スタンプを slack にあげようとしたら容量オーバーで怒られた」とかそういう「だる。」ポイントをなくす
  • エフェクトは意味のあるもの (使いどころのイメージが湧くもの) 中心で

デザイン (現状)

  • UI のアニメはよっぽど意味がある時しか使わない (ゴテゴテだと「サクッと感」が薄れる)
    • トランジションはなくてもインタラクションはしっかり (ホバー、クリックした感)
  • 常に色がついている部品は画面内でも超重要な数個だけにする (初めに操作するべき場所をはっきりさせる)
  • PC ファースト

やりたい

  • ユルい感じとかちょっとアホっぽい感じをを出したい。オモチャなので

絵文字がレンダリングできなくなっている

いつも治安の悪い絵文字で楽しんでいます。

これまで絵文字がレンダリングできたようですが、レンダリングできなくなってしまっているようです。

OS: macOS 12.6.1 (en-US), Windows 11 (en-US)
Chrome: 108.0.5359.94
Safari: 16.1

macOS
image

Windows
image

アニメーション非対応の環境でも文字を読めるようにしたい

Slackでは、アクセシビリティの機能によってアニメーションをOFFにできます。
Image from Gyazo

しかしアニメーションをOFFにすると、「カベドン」効果などを付けた絵文字を読めなくなります。
最初の1コマを表示する仕様のためです。
Image from Gyazo

アニメーション非対応の環境でも文字を読めるようにしたいです。


誰でも絵文字を作れるサービスを開発してくださり、ありがとうございます。
オープンソースとして公開されていることを知り、感激しました。

空白がトリミングされないようにして欲しい

現状だと、テキストでたとえば 絵文字 などと入力すると、左右の空白が除去されて絵文字として解釈されます。
左右の余白を調整するのに負のトリミングを指定するよりは空白を使うほうが直感的な場合もあるので、出来れば左右の空白は残しておいて欲しいです。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.