Skip to content

Commit 85abd27

Browse files
SherkeyXDMeetWq
andauthored
feat: add meme anan (#35)
* feat(meme): add meme `anan` * perf(tool): ensure to use POSIX path on all platforms * adjust --------- Co-authored-by: meetwq <meetwq@gmail.com>
1 parent 59ba147 commit 85abd27

File tree

11 files changed

+94
-2
lines changed

11 files changed

+94
-2
lines changed

meme_generator_memes/src/memes.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod alike;
77
mod alipay;
88
mod always;
99
mod always_like;
10+
mod anan_say;
1011
mod anti_kidnap;
1112
mod anya_suki;
1213
mod applaud;
@@ -64,6 +65,7 @@ mod dont_touch;
6465
mod doraemon_say;
6566
mod douyin;
6667
mod eat;
68+
mod elysia_holdsign;
6769
mod erised_mirror;
6870
mod fade_away;
6971
mod fanatic;
@@ -279,4 +281,3 @@ mod you_dont_get;
279281
mod you_should_call;
280282
mod your_new_years_eve;
281283
mod youtube;
282-
mod elysia_holdsign;
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use rand::seq::SliceRandom;
2+
use skia_safe::{Color, FontStyle, IRect};
3+
4+
use meme_generator_core::error::Error;
5+
use meme_generator_utils::{
6+
builder::{InputImage, MemeOptions},
7+
canvas::CanvasExt,
8+
encoder::encode_png,
9+
image::ImageExt,
10+
text_params,
11+
tools::{load_image, local_date, new_paint},
12+
};
13+
14+
use crate::{register_meme, tags::MemeTags};
15+
16+
#[derive(MemeOptions)]
17+
struct Expression {
18+
/// 表情类型
19+
#[option(short, long, choices=["angry", "black", "happy", "shy", "speechless"])]
20+
expression: Option<String>,
21+
}
22+
23+
fn anan_say(_: Vec<InputImage>, texts: Vec<String>, options: Expression) -> Result<Vec<u8>, Error> {
24+
let text = &texts[0];
25+
let expression = options.expression.as_deref().unwrap_or({
26+
let mut rng = rand::thread_rng();
27+
["angry", "black", "happy", "shy", "speechless"]
28+
.choose(&mut rng)
29+
.unwrap()
30+
});
31+
32+
let base_image = load_image(&format!("anan/{}.png", expression))?;
33+
let mut surface = base_image.to_surface();
34+
let canvas = surface.canvas();
35+
36+
let text_rect = IRect::from_ltrb(105, 445, 412, 625);
37+
canvas.draw_text_area_auto_font_size(
38+
text_rect,
39+
text,
40+
20.0,
41+
60.0,
42+
text_params!(
43+
paint = new_paint(Color::BLACK),
44+
font_style = FontStyle::bold()
45+
),
46+
)?;
47+
48+
let hand_image = load_image("anan/hand.png")?;
49+
canvas.draw_image(&hand_image, (0, 0), None);
50+
51+
encode_png(surface.image_snapshot())
52+
}
53+
54+
register_meme!(
55+
"anan_say",
56+
anan_say,
57+
min_texts = 1,
58+
max_texts = 1,
59+
default_texts = &["吾辈很开心"],
60+
keywords = &["安安说"],
61+
tags = MemeTags::natsume_anan(),
62+
date_created = local_date(2025, 11, 8),
63+
date_modified = local_date(2025, 11, 8),
64+
);

meme_generator_memes/src/tags.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ meme_tags!(
130130
ayachi = (["绫地宁宁"], sabbat_of_the_witch),
131131
// 请问您今天要来点兔子吗?
132132
kafu_chino = (["香风智乃"]),
133+
// 魔法少女的魔女审判
134+
magical_girl_witch_trials = (["魔法少女的魔女审判"]),
135+
natsume_anan = (["夏目安安"], magical_girl_witch_trials),
133136
// 其他
134137
atri = (["亚托莉", "ATRI", "萝卜子"]),
135138
capoo = (["猫猫虫", "咖波"]),

resources/images/anan/angry.png

254 KB
Loading

resources/images/anan/black.png

251 KB
Loading

resources/images/anan/hand.png

9.44 KB
Loading

resources/images/anan/happy.png

252 KB
Loading

resources/images/anan/shy.png

254 KB
Loading
254 KB
Loading

resources/resources.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,30 @@
110110
"file": "always_like/0.png",
111111
"hash": "303b6a4cd39c0e25c7f093902763c740eb3289e5335c5e39b13942f299fdf286"
112112
},
113+
{
114+
"file": "anan/angry.png",
115+
"hash": "d002863dd39d221010a32dbbcfad278a5876b087f40022054eb001c204c1075e"
116+
},
117+
{
118+
"file": "anan/black.png",
119+
"hash": "2ffee91f6dde8a22e07549d39cce1eb223622c82c22ff6783cbee779a03a5395"
120+
},
121+
{
122+
"file": "anan/hand.png",
123+
"hash": "de03cc289e6fb19ab392af8df2da883318cf421bb6e2777722f79d92e0b1dd02"
124+
},
125+
{
126+
"file": "anan/happy.png",
127+
"hash": "de97f0a8ddb73df18ecf8d33039c2e511f19efa31f6799a13b20237619c47ad9"
128+
},
129+
{
130+
"file": "anan/shy.png",
131+
"hash": "86668071d4bc1e7b00b43d3bf4af477845ac94a0bb48974280d1c65452f5762d"
132+
},
133+
{
134+
"file": "anan/speechless.png",
135+
"hash": "f3e1bf5b148bd16ebbfa98bfee22df07c39e7302ba832687c54843d05bf204fc"
136+
},
113137
{
114138
"file": "anti_kidnap/0.png",
115139
"hash": "5d82a378ed7b8103b80e12b30f3fb812afc17812eb5e8424f5a7d10d836191bb"

0 commit comments

Comments
 (0)