পিআইএল ব্যবহার করে ছবিতে পাঠ্য যুক্ত করুন


94

আমার একটি অ্যাপ্লিকেশন রয়েছে যা একটি চিত্র লোড করে এবং যখন ব্যবহারকারী এটি ক্লিক করে, তখন এই চিত্রটির জন্য একটি পাঠ্য অঞ্চল উপস্থিত হয় (ব্যবহার করা হয় jquery), যেখানে ব্যবহারকারী চিত্রটিতে কিছু পাঠ্য লিখতে পারেন। যা ছবিতে যুক্ত করা উচিত।

এটি নিয়ে কিছু গবেষণা করার পরে, আমি অনুভব করেছি যে PIL(পাইথন ইমেজিং লাইব্রেরি) এটি করতে আমাকে সহায়তা করতে পারে। সুতরাং এটি কীভাবে কাজ করে তা দেখার জন্য আমি কয়েকটি উদাহরণ চেষ্টা করেছিলাম এবং আমি কোনও চিত্রটিতে লেখার ব্যবস্থা করতে পেরেছি। তবে আমি মনে করি এটি ব্যবহার করার সময় Python Shellএবং ওয়েব এনভায়রনমেন্টে কিছুটা পার্থক্য রয়েছে । আমি বোঝাতে চাইছি টেক্সারিয়ায় লেখাটি খুব বড় px। আমি টেক্সারিয়ায় যেমন পিআইএল ব্যবহার করি তখন একই আকারের পাঠ্য কীভাবে অর্জন করতে পারি?

পাঠ্যটি মাল্টলাইন। আমি কীভাবে এটি ব্যবহার করে ছবিতে মাল্টলাইন তৈরি করতে পারি PIL?

পিআইএল ব্যবহারের চেয়ে ভাল উপায় আছে কি? আমি পুরোপুরি নিশ্চিত নই, যদি এটি সর্বোত্তম বাস্তবায়ন হয়।

এইচটিএমএল:

<img src="images/test.jpg"/>

এটি চিত্র সম্পাদনা করা হচ্ছে

var count = 0;
$('textarea').autogrow();
$('img').click(function(){
    count = count + 1;
    if (count > 1){
        $(this).after('<textarea />');
        $('textarea').focus();
    }   
});

টেক্সারিয়া যুক্ত করার জন্য jquery। এছাড়াও পাঠ্য অঞ্চলটি অবস্থান: পরম এবং স্থির আকার।

আমি কি এটি কোনও ফর্মের মধ্যে রেখে দেব যাতে আমি ছবিতে টেক্সারিয়ার স্থানাঙ্ক পেতে পারি? আমি যখন ব্যবহারকারী ক্লিক করেন তখন আমি ছবিতে পাঠ্য লিখতে চাই এবং তা চিত্রটিতে সংরক্ষণ করতে চাই।


আপনি কেন পিআইএল ব্যবহার করে কোনও চিত্রের পাঠ্য লিখতে চান (এবং পিআইএল তাতে সহায়তা করে কিনা তা আমি নিশ্চিত নই)। আপনার ওভারলেতে পাঠ্য প্রদর্শন করা কি যথেষ্ট নয়, যা স্লাইডারগুলিতে সর্বাধিক ব্যবহৃত হয়?
ললিট

4
একটি প্রকল্পের জন্য আমার এটি দরকার আমি চাই চিত্রটি সংরক্ষণ করা হোক। পিল ইমেজড্রো ব্যবহার করে কোনও ছবিতে টেক্সট আঁকতে পারে, অন্য কোনও উপায় আছে কিনা তা জানেন না।
অ্যাপোস্টোলোস

এটি সহায়ক হবে, আপনি যদি ব্যবহার করছেন পাইথন কোডটি সরবরাহ করতে পারেন?
ললিট

জ্যাঙ্গোতে এখনও কার্যকর হয়নি। আমি পিআইএল কীভাবে ইন্টারেক্টিভ পাইথন কনসোলে কাজ করে তা দেখার চেষ্টা করেছি। এটি প্রথমে কাজ করে কিনা তা দেখতে চান এবং তারপরে এটি জ্যাঙ্গোতে স্থানান্তর করুন।
অ্যাপোস্টোলোস

আপনার কোড $ চিহ্ন কি?
মুগেন

উত্তর:


173

আমি মনে করি এতে থাকা ইমেজফন্ট মডিউলটি PILপাঠ্য ফন্টের আকার সমস্যা সমাধানে সহায়ক হতে হবে। আপনার জন্য কোন ফন্টের ধরণ এবং আকার উপযুক্ত তা কেবল যাচাই করুন এবং ফন্টের মান পরিবর্তন করতে নিম্নলিখিত ফাংশনটি ব্যবহার করুন।

# font = ImageFont.truetype(<font-file>, <font-size>)
# font-file should be present in provided path.
font = ImageFont.truetype("sans-serif.ttf", 16)

সুতরাং আপনার কোড এর সাথে সাদৃশ্যপূর্ণ কিছু দেখাচ্ছে:

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw 

img = Image.open("sample_in.jpg")
draw = ImageDraw.Draw(img)
# font = ImageFont.truetype(<font-file>, <font-size>)
font = ImageFont.truetype("sans-serif.ttf", 16)
# draw.text((x, y),"Sample Text",(r,g,b))
draw.text((0, 0),"Sample Text",(255,255,255),font=font)
img.save('sample-out.jpg')

ফন্টের আকার গণনা করার জন্য আপনার কিছু অতিরিক্ত প্রচেষ্টা করা দরকার। আপনি যে পরিমাণ পাঠ্য ব্যবহারকারী সরবরাহ করেছেন তার ভিত্তিতে আপনি এটি পরিবর্তন করতে চান TextArea

পাঠ্য মোড়ানোর (একাধিক জিনিস) যুক্ত করতে কেবল এক লাইনে কয়টি অক্ষর আসতে পারে তার একটি মোটামুটি ধারণা নিন, তবে আপনি সম্ভবত আপনার পাঠ্যের জন্য প্রাক-প্রসেসিং ফাংশন লিখতে পারেন, যা মূলত প্রতিটি লাইনের শেষে যে চরিত্রটি খুঁজে পায় এবং এই অক্ষরটির আগে সাদা স্থানকে নতুন লাইনে রূপান্তর করে।


4
এটাই আমার প্রাথমিক চিন্তা। কাজ করার জন্য আমার ফন্টগুলি কি আমার ওয়েবসারভারের একটি নির্দিষ্ট ফোল্ডারে থাকা দরকার? আমার মনে হয় হ্যাঁ। পাঠ্য মোড়ানো? একটি মানক উপায় আছে বা আমি একটি প্রয়োগ করা আবশ্যক?
অ্যাপোস্টোলোস

আপনি ফন্ট ফাইলটি আপনার ওয়েব সার্ভারে যে কোনও জায়গায় রাখতে পারেন। আপনার প্রদত্ত পথটি সঠিক কিনা তা নিশ্চিত করুন।
1313 এ লাইট

7
@ ললিত আমি আপনার কোডটি একটি উইন্ডোজ মেশিনে চেষ্টা করেছিলাম এবং ফন্টটির জন্য আমি একটি ত্রুটি পেয়েছি self.font = core.getfont(file, size, index, encoding) IOError: cannot open resource। আমি কীভাবে ফন্ট ফাইলের পথ সরবরাহ করতে পারি?
এলডব্লিউজেড

4
@ এলডব্লিউজেড, উপরের কোডটি চালাতে, কেবলমাত্র নিশ্চিত হয়ে নিন যে ফন্ট ফাইলটি বর্তমান ডিরেক্টরিতে রয়েছে যেখানে আপনি উপরের কোডটি সম্পাদন করছেন। আপনি যদি এটিকে আপনার প্রোগ্রামটিতে ব্যবহার করছেন তবে আপনার ফাইলের পুরো পথ নির্দিষ্ট করুন যেমন 'সি: \ উইন্ডোজ \ ফন্টস ans সং-সেরিফ.টিএফ'। অন্যান্য জিনিস যা আপনার এখানে নিশ্চিত করা দরকার তা হ'ল ফাইলটিতে উপযুক্ত পড়ার অনুমতি দেওয়া।
ললিত

4
হরফ = ইমেজফন্ট.ট্রুয়েটাইপ ("./ arial.ttf", 30); অঙ্কন.টেক্সটসাইজ (_, ফন্ট = ফন্ট);
ওয়েজহংতু

16

আপনি আপনার প্রকল্পের মূলটিতে একটি ডিরেক্টরি "ফন্ট" তৈরি করতে পারেন এবং সেখানে আপনার ফন্টগুলি (sans_serif.ttf) রাখতে পারেন। তারপরে আপনি এই জাতীয় কিছু তৈরি করতে পারেন:

fonts_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts')
font = ImageFont.truetype(os.path.join(fonts_path, 'sans_serif.ttf'), 24)

15

আরও ন্যূনতম উদাহরণ (চিত্রের উপরের-বামে কালো এবং "ডিফল্ট ফন্ট সহ" হ্যালো ওয়ার্ল্ড আঁকুন):

...
from PIL import ImageDraw
...
ImageDraw.Draw(
    image  # Image
).text(
    (0, 0),  # Coordinates
    'Hello world!',  # Text
    (0, 0, 0)  # Color
)

8

প্রথমত, আপনাকে একটি হরফ ধরণ ডাউনলোড করতে হবে ... উদাহরণস্বরূপ: https://www.wfouts.com/font/microsoft-sans-serif

এর পরে, পাঠ্যটি আঁকতে এই কোডটি ব্যবহার করুন:

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw 
img = Image.open("filename.jpg")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(r'filepath\..\sans-serif.ttf', 16)
draw.text((0, 0),"Draw This Text",(0,0,0),font=font) # this will draw text with Blackcolor and 16 size

img.save('sample-out.jpg')

5

বালিশের সাহায্যে, আপনি চিত্র-চিত্র মডিউলটি ব্যবহার করে একটি চিত্রও আঁকতে পারেন। আপনি লাইন, পয়েন্ট, উপবৃত্তাকার, আয়তক্ষেত্র, আরকস, বিটম্যাপস, কর্ডস, পাইস্লাইসস, বহুভুজ, আকার এবং পাঠ্য আঁকতে পারেন।

from PIL import Image, ImageDraw
blank_image = Image.new('RGBA', (400, 300), 'white')
img_draw = ImageDraw.Draw(blank_image)
img_draw.rectangle((70, 50, 270, 200), outline='red', fill='blue')
img_draw.text((70, 250), 'Hello World', fill='green')
blank_image.save('drawn_image.jpg')

আমরা নতুন () পদ্ধতিতে একটি চিত্র অবজেক্ট তৈরি করি। এটি কোনও লোড হওয়া ইমেজ ছাড়াই একটি চিত্র অবজেক্ট দেয়। এরপরে আমরা চিত্রটি সংরক্ষণ করার আগে একটি আয়তক্ষেত্র এবং কিছু পাঠ্য যুক্ত করি।


4

অন্যান্য উত্তরে উল্লেখ না করা একটি জিনিস হ'ল পাঠ্যের আকার পরীক্ষা করা। এটি প্রায়ই পাঠ্যটি চিত্রের সাথে খাপ খায় এমনটি নিশ্চিত করা প্রয়োজন (উদাহরণস্বরূপ বৃহত্তর আকারে পাঠ্য সংক্ষিপ্ত করুন) বা পাঠ্যটি আঁকতে অবস্থান নির্ধারণের জন্য (যেমন প্রান্তিক পাঠ্য শীর্ষের কেন্দ্রটি)। বালিশ / পিআইএল পাঠ্য আকার যাচাই করার জন্য দুটি পদ্ধতি সরবরাহ করে, একটিতে চিত্রফন্টের মাধ্যমে এবং একটি চিত্র চিত্রের মাধ্যমে Image নীচে দেখানো হয়েছে, ফন্টটি একাধিক রেখাযুক্ত পরিচালনা করে না, যখন চিত্রনাঙ্কন করে।

In [28]: im = Image.new(mode='RGB',size=(240,240))                                                            
In [29]: font = ImageFont.truetype('arial')
In [30]: draw = ImageDraw.Draw(im)
In [31]: t1 = 'hello world!'
In [32]: t2 = 'hello \nworld!'
In [33]: font.getsize(t1), font.getsize(t2) # the height is the same
Out[33]: ((52, 10), (60, 10)) 
In [35]: draw.textsize(t1, font), draw.textsize(t2, font)  # handles multi-lined text
Out[35]: ((52, 10), (27, 24)) 

এই পার্থক্যটি হাইলাইট করার জন্য ধন্যবাদ। আমি প্রকৃতপক্ষে বহু-লাইনে সঠিক পাঠ্যের আকার পাওয়ার জন্য খুঁজছিলাম।
fcole90

-9

কোনও চিত্র ফাইলে পাঠ্য যুক্ত করতে, কেবল নীচের কোডটি অনুলিপি করুন / আটকান

<?php
$source = "images/cer.jpg";
$image = imagecreatefromjpeg($source);
$output = "images/certificate".rand(1,200).".jpg";
$white = imagecolorallocate($image,255,255,255);
$black = imagecolorallocate($image,7,94,94);
$font_size = 30;
$rotation = 0;
$origin_x = 250;
$origin_y = 450;
$font = __DIR__ ."/font/Roboto-Italic.ttf";
$text = "Dummy";
$text1 = imagettftext($image,$font_size,$rotation,$origin_x,$origin_y,$black,$font,$text);
     imagejpeg($image,$output,99);
?> <img src="<?php echo $output; ?>"> <a href="<?php echo $output;    ?>" download="<?php echo $output; ?>">Download Certificate</a>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.