Reza Seyed Abdollahi
Reza Seyed Abdollahi
خواندن ۲ دقیقه·۳ سال پیش

آموزش نگاتیو کردن عکس با استفاده از pygame

قبلا که دنیای دیجیتال جهان را فرا نگرفته بود ، عکاسی عالمی داشت انصافا! یکی از تفریحات کودکی تماشای نگاتیو ها بود. چشم ها را ریز می کردیم و با دقت نگاتیو ها را نگاه می کردیم تا شاید بشود آدم های تو عکس که همه مو سفید و ترسناک! شده بودند را تشخیص بدیم.

کتابخانه pygame یک کتابخانه رایگان و متن باز به زبان برنامه نویسی پایتون برای ساخت برنامه های چند رسانه ای و بازی می باشد. طبیعتا کتابخانه ای که برای ساخت بازی استفاده می شود ، قابلیت ویرایش تصاویر نیز دارد.

برای استفاده از کتابخانه pygame ابتدا آن را import می کنیم.

import pygame

سپس عکس را لود می کنیم و در img ذخیره می کنیم.

img = pygame.image.load('F:\location\input1.jpg')

برای نگاتیو کردن عکس ، ما به پیکسل به پیکسل عکسمان احتیاج داریم. هر پیکسل شامل چهار مولفه است که اختصارا آن را RGBA می نامند.

مدل رنگی آرجی‌بی ای (َRGBA) برای ایجاد تصویر در صفحه های نمایش به کار گرفته می‌شود. در این مدل، تمام رنگ‌ها از ترکیب سه رنگ تشکیل می‌شود. این سه رنگ عبارت هستند از قرمز (R) (RED) سبز (G) (GREEN) آبی (B) (BLUE) که به آن RGB اطلاق می‌شود. با ترکیب رنگ‌های یادشده که به آن‌ها ابتدایی (Primary) می‌گویند، رنگهای دیگر یا ثانویه (Secondary) ایجاد می‌شود. همچنین مولفه آلفا (A)(Alpha) میزان شفافیت رنگ را مشخص می کند.

مثال RGBA
مثال RGBA

اصولا به عکس نگاتیو شده از عبارت عکس معکوس شده استفاده می کنند. یعنی همه رنگ های آن معکوس شده اند. برای مثال اگر یک پیکسل از عکس دارای مقدار rgb(255, 255, 255) که معادل رنگ سفید باشد ، در مدل نگاتیو شده دارای مقدار rgb(0, 0, 0) که معادل رنگ مشکی می شود.

پس ما در pygame باید پیکسل به پیکسل عکسمان را بگیریم و مقدار rgb آن را از عدد 255 کم کنیم و نتیجه را در img ذخیره کنیم.

برای گرفتن یک پیکسل از عکس از کتابخانه pygame ، ماژول Surface فراخوانی و از تابع get_at استفاده می کنیم. این خط از کد ما در عکس به سراغ پیکسل شماره (x, y) می رود و یک pygame.Color که شامل اطلاعات rgba است بر می گرداند.

color = pygame.Surface.get_at(img, (x,y))

حال مقدار rgb که داریم را از 255 کم می کنیم و مجدد در color ذخیره می کنیم:

color = pygame.Color(255 - color.r, 255 - color.g, 255 - color.b)

ولی مگه نگفتیم نگاتیو معکوس است؟ :) پس بیا به جای قطعه کد بالا از این کد کوتاه استفاده کنیم:

color = ~color

سپس پیکسل جدید را در مولفه img جایگزین می کنیم:

pygame.Surface.set_at(img, (x,y), color)

این کار را برای همه پیکسل های عکس باید انجام بدیم. پس باید مقدار width و height عکس را گرفته و با توجه مقدار آن در حلقه for این کد را اجرا کنیم تا همه پیکسل های عکس نگاتیو یا اصطلاحا معکوس شوند.

پس از اینکه همه پیکسل های عکس نگاتیو شدند باید عکس را ذخیره کنیم:

pygame.image.save(img, 'F:\location\output.png')

نمونه کامل کد نگاتیو کردن عکس:

https://gist.github.com/SeyedAbdollahi/c4c831b58d25a960a45f6157415cbc26




pygameپایتونpython
شاید از این پست‌ها خوشتان بیاید