تخطيط نص الميم
يحوّل مولد تخطيط نص الميم عرض الصورة وارتفاعها وتعليقين إلى تعليمات رسم عملية. ويختار حجم خط واحدا واضحا لكلا التعليقين، ويوزع كل تعليق على أسطر، ثم يعيد إطارات إحاطة بالبكسل مثبتة قرب الحافتين العليا والسفلى.
شغّل الأداة مجانًا
الحساب حتمي، ولذلك تنتج المدخلات نفسها الإحداثيات نفسها دائما. يمكنكم استخدام النتيجة مع Canvas أو SVG أو مكتبة لمعالجة الصور أو خدمة تصيير، وذلك للحصول على كتابة متناسقة للميم من دون تكرار تجارب تغيير حجم الخط.
أدخلوا أبعاد اللوحة والتعليقين
أدخلوا عرض الصورة وارتفاعها بالبكسل، ثم النص الذي ينبغي أن يظهر في الأعلى والنص الذي ينبغي أن يظهر في الأسفل. يلزم تقديم التعليقين لأن هذا التخطيط يوازن ميما كاملا يحتوي على منطقتين للنص. تزال المسافات من بداية كل تعليق ونهايته، وتوحّد المسافات المتكررة داخله قبل القياس. لذلك يؤدي التعليق الفارغ إلى خطأ واضح في المدخلات بدلا من إطار مضلل ذي مساحة صفرية. يجب أن تكون الأبعاد أعدادا صحيحة من 64 إلى 10,000 بكسل، ويمكن أن يحتوي كل تعليق على 500 محرف كحد أقصى. تجعل هذه الحدود الحساب متوقعا سواء في الصفحة التفاعلية أم في سير عمل آلي. يعتمد الهامش على ضلع الصورة الأقصر، وبذلك تبقى المسافة البصرية متقاربة في الصور الطولية والعرضية والمربعة. إذا كنتم ستغيرون حجم الصورة قبل التصيير، فأعيدوا الحساب باستخدام أبعادها النهائية للحفاظ على قرارات التفاف الأسطر وتباعدها ومحاذاتها.
افهموا آلية الملاءمة والتفاف الأسطر
تختار الحاسبة حجما صحيحا واحدا للخط يتشاركه التعليقان. تبدأ بقيمة مشتقة من أبعاد الصورة، ثم تختبر أحجاما أصغر تدريجيا إلى أن يلائم كل من الجزء العلوي والجزء السفلي المساحة المحددة. يستطيع كل تعليق شغل ما يصل إلى اثنين وأربعين بالمئة من ارتفاع الصورة القابل للاستخدام، مما يبقي فاصلا بين المنطقتين حتى عندما يمتد النصان على عدة أسطر. تبقى الكلمات كاملة متى أمكن ذلك. وإذا كانت كلمة واحدة أعرض من المساحة المتاحة، فإنها تقسم إلى أجزاء أصغر كي لا يتجاوز إطارها حدود الصورة. تستخدم تقديرات العرض ملفا داخليا ثابتا لحروف الميم العريضة والسميكة؛ فالمحارف الضيقة تشغل مساحة أقل، بينما تشغل الحروف اللاتينية الكبيرة والعريضة مساحة أكبر. هذا تخطيط تحليلي وليس قياسا فعليا للخط في المتصفح. للحصول على أقرب نتيجة، استخدموا خطا سميكا ومضغوطا شبيها بخط Impact، وطبقوا ارتفاع السطر المعاد، وحاذوا كل سطر في الوسط.
صيّروا هندسة البكسل المعادة
تتضمن النتيجة حجم الخط المختار، وارتفاع السطر، والهامش الخارجي، وكائنين منفصلين للجزء العلوي والجزء السفلي. يحتوي كل كائن على أسطره بعد الالتفاف، إلى جانب الإحداثيين x وy والعرض والارتفاع بالبكسل. يبدأ الإطار العلوي عند الهامش المحسوب، وينتهي الإطار السفلي على المسافة نفسها فوق الحافة السفلى، ولذلك يظل موضعه ثابتا مهما تغير عدد الأسطر. ارسموا الأسطر بدءا من إحداثي y للإطار، وانتقلوا بمقدار ارتفاع السطر، ثم حاذوا كل سطر أفقيا إلى وسط الصورة كاملة. إذا كانت واجهة الرسوم التي تستخدمونها تضع النص اعتمادا على خط الأساس بدلا من أعلى إطار السطر، فأضيفوا ارتفاع الجزء الصاعد للخط المختار قبل الرسم. لا تشمل هذه القدرة سمك الحد أو الظل أو تحويل حالة الأحرف أو اللون؛ فهذه العناصر تغير المظهر ولا تغير المساحة المحجوزة. في العمليات الآلية، احفظوا قيم التخطيط مع التعليقين كي تعيدوا إنتاج التركيب نفسه من دون تجارب يدوية جديدة.
حالات الاستخدام
إنشاء مولد للميمات
احسبوا هندسة متناسقة للتعليقات قبل رسم النص فوق قوالب الصور التي يختارها مستخدموكم.
إعداد أوامر Canvas أو SVG
حوّلوا تعليقين إلى أسطر وإطارات بالبكسل يمكن لواجهة التصيير استخدامها مباشرة.
أتمتة إنتاج صور الشبكات الاجتماعية
أنشئوا تخطيطات قابلة للتكرار لدفعات من الصور ذات التعليقات من دون اختبار أحجام خطوط متعددة يدويا.
الأسئلة الشائعة
ما تكلفة الحساب؟
تبلغ تكلفة كل طلب API مقدار $0.002. ويمكن أيضا تنفيذ الحساب الحتمي نفسه داخل المتصفح.
لماذا يجب أن يحتوي التعليقان على نص؟
تحسب هذه القدرة تخطيطا متوازنا لتعليقين. ويرفض التعليق العلوي أو السفلي إذا كان فارغا أو مكونا من مسافات فقط باعتباره مدخلا غير صالح.
هل تعدل النتيجة صورتي؟
لا. تعيد النتيجة بيانات الخط والهندسة فقط. استخدموها مع معالج الصور أو Canvas أو SVG الذي تفضلونه.
أي خط ينبغي استخدامه عند التصيير؟
يقدم الخط السميك والمضغوط ذو المقاييس الشبيهة بخط Impact أقرب تطابق مع التقديرات الداخلية.
هل يمكن أن تمتد كلمة طويلة خارج الصورة؟
لا. تقسم الكلمة التي تتجاوز المساحة المتاحة أثناء الالتفاف، كي تبقى جميع الإطارات داخل الهوامش الأفقية.
لماذا يشترك التعليقان في حجم الخط؟
يمنح الحجم المشترك الميم وزنا بصريا متناسقا. ويطبق الحجم الأصغر الذي يحتاج إليه أي من التعليقين على كليهما.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/image/meme-text-layout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"width":1200,"height":800,"top_caption":"WHEN THE TESTS PASS","bottom_caption":"ON THE FIRST TRY"}'const res = await fetch("https://api.kit.forhosting.com/image/meme-text-layout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"width": 1200,
"height": 800,
"top_caption": "WHEN THE TESTS PASS",
"bottom_caption": "ON THE FIRST TRY"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/meme-text-layout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"width": 1200,
"height": 800,
"top_caption": "WHEN THE TESTS PASS",
"bottom_caption": "ON THE FIRST TRY"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/meme-text-layout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"width":1200,"height":800,"top_caption":"WHEN THE TESTS PASS","bottom_caption":"ON THE FIRST TRY"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"width":1200,"height":800,"top_caption":"WHEN THE TESTS PASS","bottom_caption":"ON THE FIRST TRY"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/meme-text-layout", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"width": 1200,
"height": 800,
"top_caption": "WHEN THE TESTS PASS",
"bottom_caption": "ON THE FIRST TRY"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.meme_text_layout",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_width | 10000 |
max_height | 10000 |
max_chars | 500 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |