আমি কীভাবে কোনও পিআইএল ব্যবহার করে কোনও চিত্রকে আকার পরিবর্তন করব এবং এর অনুপাতের অনুপাত বজায় রাখতে পারি?


437

আমি অনুপস্থিত এটি করার কোন সুস্পষ্ট উপায় আছে? আমি কেবল থাম্বনেইল তৈরি করার চেষ্টা করছি।


9
যেহেতু এই প্রশ্নটি বেশ পুরানো তবে দরকারী, এবং বালিশ বরং পছন্দ করা হয়েছে, তাই বালিশ-ভিত্তিক টিউটোরিয়ালটির জন্য এটি একবার দেখুন: pillow.readthedocs.org/en/latest/handbook/…
ওয়াটওয়ার

3
চিত্রগুলি পুনরায় আকার দেওয়ার জন্য একটি ছোট লাইব্রেরি তৈরি করেছি, এটি যে কোনও সহায়ক হতে পারে: github.com/charlesthk/python-resize-image
Charlesthk

পিআইএল-এর সর্বশেষ প্রকাশটি ২০০ 2006 সালে হয়েছিল The বালিশ প্যাকেজটি আমি যতদূর জানি প্রতিস্থাপন। বালিশের সর্বশেষ প্রকাশটি ছিল 2 এপ্রিল, 2020
ডেভিড মেডিনেটস

উত্তর:


477

সর্বাধিক আকার নির্ধারণ করুন। তারপরে, গ্রহণ করে একটি আকারের অনুপাত গণনা করুনmin(maxwidth/width, maxheight/height)

সঠিক আকার হয় oldsize*ratio

এটি করার জন্য অবশ্যই একটি গ্রন্থাগার পদ্ধতি রয়েছে: পদ্ধতিটি Image.thumbnail
নীচে পিআইএল ডকুমেন্টেশন থেকে একটি (সম্পাদিত) উদাহরণ দেওয়া আছে ।

import os, sys
import Image

size = 128, 128

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im = Image.open(infile)
            im.thumbnail(size, Image.ANTIALIAS)
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for '%s'" % infile

4
যেমনটি বলা হয়েছে, উদাহরণটি পাইল ডকুমেন্টেশনের থেকে হয়েছিল এবং সেই উদাহরণটি (এখনও) অ্যান্টিয়ালিয়াস পতাকা ব্যবহার করে না। যেহেতু এটি সম্ভবত বেশিরভাগ লোকেরা চাইবে, তবে আমি এটি যুক্ত করেছিলাম।
gnud

3
পিআইএল নতুন চিত্রের উচ্চতা প্রদত্ত আকারে (এখানে 128) সেট করে এবং দিক অনুপাত রাখতে প্রস্থটি গণনা করে। উচ্চতার পরিবর্তে প্রস্থ ঠিক করার কোনও উপায় আছে কি? সম্ভবত আমি পৃথক প্রশ্নে এটি জিজ্ঞাসা করব।
ইউজিন

6
@ ইউজিন: এরকম কিছু চেষ্টা করে দেখুন s= img.size(); ratio = MAXWIDTH/s[0]; newimg = img.resize((s[0]*ratio, s[1]*ratio), Image.ANTIALIAS)? (যে বিন্দু বিভাগ ভাসমান যদিও :) জন্য এর
gnud

48
নোট করুন যে ANTIALIASপিআইএল এর জনপ্রিয় বালিশ কাঁটাচামচ ব্যবহারকারীদের জন্য আর পছন্দ করা হয় না। pillow.readthedocs.org/en/3.0.x/releasenotes/…
জোশ নির্মাতা

8
পিআইএল-এর জন্য পাইথন 3 ডকুমেন্টেশন বলছে যে thumbnailকেবল তখনই কাজ করবে যদি ফলাফলের চিত্রটি মূল চিত্রের চেয়ে ছোট হয়। যে কারণে আমি অনুমান করব যে ব্যবহার resizeকরা সবচেয়ে ভাল উপায়।
সুতরাং এস এস 21

253

এই স্ক্রিপ্টটি পিআইএল (পাইথন ইমেজিং লাইব্রেরি) ব্যবহার করে একটি চিত্র (somepic.jpg) আকার পরিবর্তন করে 300 পিক্সেলের প্রস্থ এবং নতুন প্রস্থের সমানুপাতিক উচ্চতা করবে। এটি মূল প্রস্থ (img.size [0]) এর কত শতাংশ 300 পিক্সেল তা নির্ধারণ করে এবং তারপরে সেই শতাংশের মাধ্যমে মূল উচ্চতা (img.size [1]) গুণ করে does আপনার চিত্রগুলির ডিফল্ট প্রস্থ পরিবর্তন করতে অন্য কোনও সংখ্যায় "বেসউইথ" পরিবর্তন করুন।

from PIL import Image

basewidth = 300
img = Image.open('somepic.jpg')
wpercent = (basewidth/float(img.size[0]))
hsize = int((float(img.size[1])*float(wpercent)))
img = img.resize((basewidth,hsize), Image.ANTIALIAS)
img.save('sompic.jpg') 

2
যদি আপনি এই স্ক্রিপ্টটি বাহ্যিক পদ্ধতি হিসাবে জোপে ব্যবহার করছেন তবে জোপের "চিত্র" এর সাথে নামের স্থান সংঘর্ষ এড়াতে আপনার "পিআইএল আমদানি চিত্র থেকে" লাইনটি লাগবে।
টমভন

এই কোডটি আমাকে একটি 0 বাইট আউটপুট ফাইল দেয় sompic.jpg। কেন এমন হয়? আমি পাইথন 3.x ব্যবহার করছি
imrek

- আপডেট: পাইথন ২.7-এও একই ঘটনা ঘটে।
ইমরেক

আমি বুঝতে পেরেছি। আপনি যদি একটি সংরক্ষণ করছেন .jpeg, ব্যবহার করুন img.save('sompic.jpg', 'JPEG')
ইমরেক

5
নিট আছে: নেই PIL.Image.ANTIALIASবিকল্পের জন্য resize, আসলে হওয়া উচিত PIL.Image.LANCZOS, যদিও তারা উভয় 1মান দেখতে pillow.readthedocs.io/en/3.1.x/reference/...
ফ্রেড উ

66

আমি পিআইএল এর থাম্বনেইল পদ্ধতিটি ব্যবহার করারও পরামর্শ দিচ্ছি, কারণ এটি আপনার থেকে সমস্ত অনুপাতের ঝামেলা সরিয়ে দেয়।

একটি গুরুত্বপূর্ণ ইঙ্গিত, যদিও: প্রতিস্থাপন

im.thumbnail(size)

সঙ্গে

im.thumbnail(size,Image.ANTIALIAS)

ডিফল্টরূপে, পিআইএল পুনরায় আকার দেওয়ার জন্য ইমেজ.নোয়ার্স্ট ফিল্টার ব্যবহার করে যার ফলস্বরূপ ভাল পারফরম্যান্স হয় তবে নিম্ন মানের।


2
এটির সাহায্যে আপনি কেবল একটি চিত্রের আকার হ্রাস করতে পারেন। এর সাথে আকার বাড়ানো সম্ভব নয় Image.thumbnail
পুড়ে যাওয়া

45

@ টমভনের ভিত্তিতে, আমি নিম্নলিখিতগুলি ব্যবহার করে শেষ করেছি (আপনার কেসটি বেছে নিন):

ক) উচ্চতা পুনরায় আকার দেওয়া ( আমি নতুন প্রস্থ জানি, তাই আমার নতুন উচ্চতা প্রয়োজন )

new_width  = 680
new_height = new_width * height / width 

খ) আকার পরিবর্তন করে ( আমি নতুন উচ্চতা জানি, তাই আমার নতুন প্রস্থের প্রয়োজন )

new_height = 680
new_width  = new_height * width / height

তারপরে:

img = img.resize((new_width, new_height), Image.ANTIALIAS)

6
আপনার ভেরিয়েবলগুলি সমস্ত মিশ্রিত। আপনার পোস্টটি বলছে আকারের আকার পরিবর্তন করে এবং তারপরে উচ্চতার আকার পরিবর্তন করে। এবং resizeকলটিতে, আপনি new_widthউচ্চতা এবং প্রস্থ উভয়ের জন্য ব্যবহার করছেন ?
Zachafer

@ জাফ্যাফার
মো বেইগি

1
তাদের পূর্ণসংখ্যায় রূপান্তর করা ভাল
ব্ল্যাক থান্ডার

18

পিআইএল ইতিমধ্যে একটি চিত্র ক্রপ করার বিকল্প রয়েছে

img = ImageOps.fit(img, size, Image.ANTIALIAS)

20
এটি কেবল চিত্রটি কাটায়, এটি অনুপাতের অনুপাত বজায় রাখে না।
রাদু

2
এটি কোনওভাবেই প্রশ্নের উত্তর দেয় না।
এএমসি

15
from PIL import Image

img = Image.open('/your image path/image.jpg') # image extension *.png,*.jpg
new_width  = 200
new_height = 300
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what you want *.png, *jpg, *.gif

8
এটি উত্স চিত্রের দিক অনুপাত রাখে না। এটি চিত্রটি 200x300 এ বাধ্য করে এবং এর ফলে একটি সঙ্কুচিত বা প্রসারিত চিত্র দেখা দেয়।
পুড়ে যাওয়া

এটি কোনওভাবেই প্রশ্নের উত্তর দেয় না।
এএমসি

12

আপনি যদি একই দিক অনুপাত বজায় রাখার চেষ্টা করছেন, তবে আপনি কি মূল আকারের কিছু শতাংশের মাধ্যমে আকার পরিবর্তন করবেন না?

উদাহরণস্বরূপ, মূল আকারের অর্ধেক

half = 0.5
out = im.resize( [int(half * s) for s in im.size] )

13
এটি হতে পারে যে চিত্রগুলি বিভিন্ন আকারের ছিল এবং পুনরায় আকারের ফলাফলটি সমান আকারের হওয়া দরকার
স্টিইন

7
from PIL import Image
from resizeimage import resizeimage

def resize_file(in_file, out_file, size):
    with open(in_file) as fd:
        image = resizeimage.resize_thumbnail(Image.open(fd), size)
    image.save(out_file)
    image.close()

resize_file('foo.tif', 'foo_small.jpg', (256, 256))

আমি এই গ্রন্থাগারটি ব্যবহার করি:

pip install python-resize-image

7

আপনি যদি বালিশ দিয়ে চিত্র খোলার প্রয়োজন না / না চান তবে এটি ব্যবহার করুন:

from PIL import Image

new_img_arr = numpy.array(Image.fromarray(img_arr).resize((new_width, new_height), Image.ANTIALIAS))

4

এই প্রশ্নটি কেবলমাত্র আরও আধুনিক মোড়কের সাথে আপডেট করে এই গ্রন্থাগারটি বালিশ (পিআইএল এর একটি কাঁটাচামচ) মুড়ে ফেলে https://pypi.org/project/python-resize-image/

আপনাকে এরকম কিছু করার অনুমতি দিচ্ছে: -

from PIL import Image
from resizeimage import resizeimage

fd_img = open('test-image.jpeg', 'r')
img = Image.open(fd_img)
img = resizeimage.resize_width(img, 200)
img.save('test-image-width.jpeg', img.format)
fd_img.close()

উপরের লিঙ্কে আরও উদাহরণ গাদা করে।


3
আকার পরিবর্তন_ কনটেন দেখতে আসলে বেশ কার্যকর!
এন্টিওয়ে

4

আমি একটি স্লাইডশো ভিডিওর জন্য কিছু চিত্রের আকার পরিবর্তন করার চেষ্টা করছিলাম এবং সে কারণে আমি কেবল একটি সর্বোচ্চ মাত্রা নয়, একটি সর্বোচ্চ প্রস্থ এবং একটি সর্বোচ্চ উচ্চতা (ভিডিও ফ্রেমের আকার) চেয়েছিলাম ।
সেখানে সবসময় একটি প্রতিকৃতি ভিডিও সম্ভাবনা ছিল ...
দ্যImage.thumbnail পদ্ধতি প্রতিশ্রুতি ছিল, কিন্তু আমি এটা, upscale একটি ছোট চিত্র তৈরি করতে না পারে।

সুতরাং আমি এখানে (বা অন্য কোনও জায়গায়) এটি করার কোনও সুস্পষ্ট উপায় খুঁজে না পাওয়ার পরে, আমি এই ফাংশনটি লিখেছি এবং আসার জন্য এটি এখানে রেখেছি:

from PIL import Image

def get_resized_img(img_path, video_size):
    img = Image.open(img_path)
    width, height = video_size  # these are the MAX dimensions
    video_ratio = width / height
    img_ratio = img.size[0] / img.size[1]
    if video_ratio >= 1:  # the video is wide
        if img_ratio <= video_ratio:  # image is not wide enough
            width_new = int(height * img_ratio)
            size_new = width_new, height
        else:  # image is wider than video
            height_new = int(width / img_ratio)
            size_new = width, height_new
    else:  # the video is tall
        if img_ratio >= video_ratio:  # image is not tall enough
            height_new = int(width / img_ratio)
            size_new = width, height_new
        else:  # image is taller than video
            width_new = int(height * img_ratio)
            size_new = width_new, height
    return img.resize(size_new, resample=Image.LANCZOS)

3

সীমাবদ্ধ অনুপাত রাখতে এবং সর্বাধিক প্রস্থ / উচ্চতা অতিক্রম করার জন্য একটি সহজ পদ্ধতি। দৃষ্টিনন্দন নয় তবে কাজটি সম্পন্ন হয়েছে এবং এটি সহজে বোঝা যায়:

def resize(img_path, max_px_size, output_folder):
    with Image.open(img_path) as img:
        width_0, height_0 = img.size
        out_f_name = os.path.split(img_path)[-1]
        out_f_path = os.path.join(output_folder, out_f_name)

        if max((width_0, height_0)) <= max_px_size:
            print('writing {} to disk (no change from original)'.format(out_f_path))
            img.save(out_f_path)
            return

        if width_0 > height_0:
            wpercent = max_px_size / float(width_0)
            hsize = int(float(height_0) * float(wpercent))
            img = img.resize((max_px_size, hsize), Image.ANTIALIAS)
            print('writing {} to disk'.format(out_f_path))
            img.save(out_f_path)
            return

        if width_0 < height_0:
            hpercent = max_px_size / float(height_0)
            wsize = int(float(width_0) * float(hpercent))
            img = img.resize((max_px_size, wsize), Image.ANTIALIAS)
            print('writing {} to disk'.format(out_f_path))
            img.save(out_f_path)
            return

এখানে একটি পাইথন স্ক্রিপ্ট যা ব্যাচ চিত্রের আকার পরিবর্তন করতে এই ফাংশনটি ব্যবহার করে।


3

উপরের উত্তরটি "টমভন" দ্বারা আপডেট করেছেন

from PIL import Image

img = Image.open(image_path)

width, height = img.size[:2]

if height > width:
    baseheight = 64
    hpercent = (baseheight/float(img.size[1]))
    wsize = int((float(img.size[0])*float(hpercent)))
    img = img.resize((wsize, baseheight), Image.ANTIALIAS)
    img.save('resized.jpg')
else:
    basewidth = 64
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), Image.ANTIALIAS)
    img.save('resized.jpg')

মোহন মত কাজ! তাই আপনাকে ধন্যবাদ!
ডেনিস সাভেনকো

2

আমার কুৎসিত উদাহরণ।

ফাংশন এই জাতীয় ফাইল পান: "পিক [0-9a-z]। [এক্সটেনশন]", সেগুলি আকার পরিবর্তন করে 120x120 করা, বিভাগকে কেন্দ্রের দিকে সরানো এবং "আইকো [0-9a-z] এ সংরক্ষণ করুন। [এক্সটেনশন]", প্রতিকৃতি সহ কাজ করে এবং ল্যান্ডস্কেপ:

def imageResize(filepath):
    from PIL import Image
    file_dir=os.path.split(filepath)
    img = Image.open(filepath)

    if img.size[0] > img.size[1]:
        aspect = img.size[1]/120
        new_size = (img.size[0]/aspect, 120)
    else:
        aspect = img.size[0]/120
        new_size = (120, img.size[1]/aspect)
    img.resize(new_size).save(file_dir[0]+'/ico'+file_dir[1][3:])
    img = Image.open(file_dir[0]+'/ico'+file_dir[1][3:])

    if img.size[0] > img.size[1]:
        new_img = img.crop( (
            (((img.size[0])-120)/2),
            0,
            120+(((img.size[0])-120)/2),
            120
        ) )
    else:
        new_img = img.crop( (
            0,
            (((img.size[1])-120)/2),
            120,
            120+(((img.size[1])-120)/2)
        ) )

    new_img.save(file_dir[0]+'/ico'+file_dir[1][3:])

2

আমি চিত্রটিকে এমনভাবে আকার দিয়েছি এবং এটি খুব ভালভাবে কাজ করছে

from io import BytesIO
from django.core.files.uploadedfile import InMemoryUploadedFile
import os, sys
from PIL import Image


def imageResize(image):
    outputIoStream = BytesIO()
    imageTemproaryResized = imageTemproary.resize( (1920,1080), Image.ANTIALIAS) 
    imageTemproaryResized.save(outputIoStream , format='PNG', quality='10') 
    outputIoStream.seek(0)
    uploadedImage = InMemoryUploadedFile(outputIoStream,'ImageField', "%s.jpg" % image.name.split('.')[0], 'image/jpeg', sys.getsizeof(outputIoStream), None)

    ## For upload local folder
    fs = FileSystemStorage()
    filename = fs.save(uploadedImage.name, uploadedImage)

2

আমি পুনরায় আকারের একটি সংস্করণও যুক্ত করব যা দিক অনুপাত স্থির রাখে। এই ক্ষেত্রে, এটি প্রাথমিক চিত্র অনুপাত, এসপ_রেট , যা ভাসমান (!) এর উপর ভিত্তি করে নতুন চিত্রের প্রস্থের সাথে মিলের জন্য উচ্চতা সামঞ্জস্য করবে । তবে এর পরিবর্তে প্রস্থটি উচ্চতার সাথে সামঞ্জস্য করার জন্য আপনাকে কেবল একটি লাইন মন্তব্য করতে হবে এবং অন্য লুপে অন্যটিকে অসুবিধে করতে হবে । আপনি দেখতে পাবেন, কোথায়।

আপনার সেমিকোলনগুলির প্রয়োজন নেই (;), আমি সেগুলি কেবলমাত্র আমি প্রায়শই ব্যবহার করি।

from PIL import Image

img_path = "filename.png";
img = Image.open(img_path);     # puts our image to the buffer of the PIL.Image object

width, height = img.size;
asp_rat = width/height;

# Enter new width (in pixels)
new_width = 50;

# Enter new height (in pixels)
new_height = 54;

new_rat = new_width/new_height;

if (new_rat == asp_rat):
    img = img.resize((new_width, new_height), Image.ANTIALIAS); 

# adjusts the height to match the width
# NOTE: if you want to adjust the width to the height, instead -> 
# uncomment the second line (new_width) and comment the first one (new_height)
else:
    new_height = round(new_width / asp_rat);
    #new_width = round(new_height * asp_rat);
    img = img.resize((new_width, new_height), Image.ANTIALIAS);

# usage: resize((x,y), resample)
# resample filter -> PIL.Image.BILINEAR, PIL.Image.NEAREST (default), PIL.Image.BICUBIC, etc..
# https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize

# Enter the name under which you would like to save the new image
img.save("outputname.png");

এবং, এটি সম্পন্ন হয়েছে। আমি যতটা পারি ডকুমেন্ট করার চেষ্টা করেছি, তাই এটি পরিষ্কার।

আমি আশা করি এটি কারও পক্ষে উপকারী হতে পারে!


0

আপনার চিত্র ফাইল খুলুন

from PIL import Image
im = Image.open("image.png")

পিআইএল ইমেজ ব্যবহার করুন। আকার (আকার, পুনরায় নমুনা = 0) পদ্ধতি , যেখানে আপনি নিজের চিত্রটির (প্রশস্ততা, উচ্চতা) 2-টিউপল আকারের জন্য প্রতিস্থাপন করবেন।

এটি আপনার চিত্রটি মূল আকারে প্রদর্শন করবে:

display(im.resize((int(im.size[0]),int(im.size[1])), 0) )

এটি আপনার চিত্রটি 1/2 আকারে প্রদর্শন করবে:

display(im.resize((int(im.size[0]/2),int(im.size[1]/2)), 0) )

এটি আপনার চিত্রটি 1/3 আকারে প্রদর্শন করবে:

display(im.resize((int(im.size[0]/3),int(im.size[1]/3)), 0) )

এটি আপনার চিত্রটি 1/4 আকারে প্রদর্শন করবে:

display(im.resize((int(im.size[0]/4),int(im.size[1]/4)), 0) )

ইত্যাদি


এটি কী display()এবং কোথায় অবস্থিত?
অ্যান্টনি

0
from PIL import Image
from resizeimage import resizeimage

def resize_file(in_file, out_file, size):
    with open(in_file) as fd:
        image = resizeimage.resize_thumbnail(Image.open(fd), size)
    image.save(out_file)
    image.close()

resize_file('foo.tif', 'foo_small.jpg', (256, 256))

-1

আপনি নীচের কোড দ্বারা চিত্রের আকার পরিবর্তন করতে পারেন:

From PIL import Image
img=Image.open('Filename.jpg') # paste image in python folder
print(img.size())
new_img=img.resize((400,400))
new_img.save('new_filename.jpg')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.