الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في التعامل مع الصور مكتبة PIL

بدأه Amin0u في 3 يناير 2014 · 16 رد · 2,685 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله تعالى و بركاته

 

أريد مساعدة من ذوي الخبرة

 

لدية صور أريد قرائتها و تحويلها الى binary

 

ثم تغير بعض البتات bits  فيها

 

تم أعادة تحويل binary الى صورة 

 

باستخدام مكتبة الصور PIL

 

ممكن مساعدة مكنكم لدوال التي يجب علي استعمالها

 

لأنني أمضيت كثيرا من الوقت معها لكن بدون فائدة

#2

ابدا مع هذه الدوال

from PIL import Image, ImageDraw, ImageFont, ImageEnhance
قم بعمل dir(..) للـ 4 modules التي احضرناها
مثلا:
dir(image)
وهذا لترى الدوال التي يوفرها كل module
 
 
 

تم تعديل هذه المشاركة بواسطة med reda في 3 يناير 2014 في 00:41

1
#3

لو تكرمت بقليل من الشرح جزاك الله خيرا لاني لم أجد اي توثيقات 

 

س أريك ماكتبته لفتح الصور binary  و ثم لم أردت اعادة تحويل ال binary  للصورة  لم أستطيع

from PIL import Imageimport ioimport binasciiass=open('pnh.jpg','rb')fin=ass.read()ass.close()hex_str=str(binascii.hexlify(fin))list_bin=[]list_hex=[]for i in range(2,len(hex_str)-1,2):    hex=hex_str+hex_str[i+1]    list_hex.append(hex)    list_bin.append(bin(int(hex,16))[2:])data=''for i in list_bin:    b=int(i,2)    c=chr(b)    data=data+cdata=data.encode()imag =io.BytesIO(data)Image.save(imag,format='jpg')
#4
هل تقصد فتحها على شكل باينري ثم حفضها على شكل باينري ؟

اكتب ماذا تريد بالضبط

تم تعديل هذه المشاركة بواسطة med reda في 3 يناير 2014 في 02:33

#5

إذا كنت تريد قراءة بكسلات الصورة وتعديلها فطريقتك غير صحيحة لأن الصورة مرمزة أو مضغوطة ويختلف الترميز حسب الصيغة (تعديلك مباشرة لبيانات الصورة تخريب لها).

 

يلزمك تحميل الصورة من خلال PIL كي تفك ترميزها وتحصل على مصفوفة خام للبكسلات، ثم تعدلها لما تريد وتعيد حفظها، مثلاً:

#-*- coding: utf-8 -*-
#!python
from PIL import Image

# حمل الصورة
img = Image.open('image.jpg')
# حولها إلى مصفوفة بكسلات موحدة
pixels = img.load()
# احصل على عرض وارتفاع الصورة
width, height = img.size
#
# ستطبع شيئ مثل: (r, g, b, a) أو (r, g, b)
# r: اللون الأحمر
# g: اللون الأخضر
# b: اللون الأزرق
# a: الشفافية إذا كانت الصيغة تدعمها مثل png
#
# مدى القيم من 0-255
print pixels[0, 0] # أول بكسل عند 0، 0

for x in xrange(0, width):
  for y in xrange(0, height):
    pixel = list(pixels[x, y])
    # الآن عدل البكسل واعمل ماتريد ثم احفظه
    pixels[x, y] = tuple(pixel)

# احفظ الصورة
img.save('image2.jpg')

في السطر:

 

pixels = img.load()

 

تكون حصلت على بيانات الصورة (مصفوفة البكسلات)، الآن يمكنك تعديلها كما في الأمثلة ثم تحفظها.

 

بعض التجارب على الصورة:

 

post-231926-0-49808600-1388707803.jpg

for x in xrange(0, width):
  for y in xrange(0, height):
    pixel = list(pixels[x, y])
    # تجربة عكس الألوان
    pixel[0] ^= 255 # الأحمر
    pixel[1] ^= 255 # الأخضر
    pixel[2] ^= 255 # الأزرق
    # pixel[3] الشفافية إذا كانت الصغة تدعمها
    pixels[x, y] = tuple(pixel)

post-231926-0-71762400-1388707831.jpg

for x in xrange(0, width):
  for y in xrange(0, height):
    pixel = list(pixels[x, y])
    # جعل الصورة أبيض واسود بأخذ المتوسط للألوان
    average = (pixel[0] + pixel[1] + pixel[2]) / 3
    pixel[0] = average # الأحمر
    pixel[1] = average # الأخضر
    pixel[2] = average # الأزرق
    # pixel[3] الشفافية إذا كانت الصغة تدعمها
    pixels[x, y] = tuple(pixel)

post-231926-0-34130400-1388707862.jpg

for x in xrange(0, width):
  for y in xrange(0, height):
    pixel = list(pixels[x, y])
    # جعل الصورة تبدو قديمة
    average = (pixel[0] + pixel[1] + pixel[2]) / 3
    pixel[0] = int(average * 0.9) # الأحمر
    pixel[1] = int(average * 0.8) # الأخضر
    pixel[2] = int(average * 0.4) # الأزرق
    # pixel[3] الشفافية إذا كانت الصغة تدعمها
    pixels[x, y] = tuple(pixel)

post-231926-0-77827700-1388707889.jpg

for x in xrange(0, width):
  for y in xrange(0, height):
    pixel = list(pixels[x, y])
    # زيادة إضاءة الصورة
    amount = 50
    pixel[0] = min(255, pixel[0] + amount)
    pixel[1] = min(255, pixel[1] + amount)
    pixel[2] = min(255, pixel[2] + amount)
    # pixel[3] الشفافية إذا كانت الصغة تدعمها
    pixels[x, y] = tuple(pixel)

post-231926-0-54722300-1388707920.jpg

تم تعديل هذه المشاركة بواسطة Mr.B في 3 يناير 2014 في 03:30

2
#6

فتحها على شكل بيناري التعديل على البيانري ثم حفضها على شكل صورة معدلة

#7

شكرا على المعلومات أخي Mr b

 

لكن لم أفهم كيف أحصل على الصورة بالبيناري  

#8

أخي هل تعرف ماهو البيانري؟ كل شيء يخزن في الكمبيوتر كباينري، اشرح بالعربي ماتريد

#9

هل تعرف الstganography  

 

http://ar.wikipedia.org/wiki/%D8%B3%D8%AA%D9%8A%D8%BA%D8%A7%D9%86%D9%88%D8%BA%D8%B1%D8%A7%D9%81%D9%8A

 

أريد اخفاء نص خلف صورة

 

/index.php/topic/209741-steganography/

 

و هذا العمل يعتمد على تحليل الصور الى الاعداد الثانئية و التغير فيها ثم حفظها

 

post-275853-0-10666300-1388708816_thumb.

 

1byte = 8 bits

تم تعديل هذه المشاركة بواسطة Amin0u في 3 يناير 2014 في 03:31

#10

هذا مصدر أفضل (Steganography)

 

هذه الطريقة تعتمد على تعديل بكسلات الصورة وليس بياناتها (يلزم استخدام صيغة تحتفظ بالبيانات الأصلية مثل png أو bmp)، إذا كان لديك حرف مثل A، يكافئ 01000001، فتقوم بتوزيع بتاته على 3 بكسلات كالتالي:

A = 01000001

pixel.1.red   = 1111111 1 + A[7] = 1111111 0
pixel.1.green = 1111111 1 + A[6] = 1111111 1
pixel.1.blue  = 1111111 1 + A[5] = 1111111 0

pixel.2.red   = 1111111 1 + A[4] = 1111111 0
pixel.2.green = 1111111 1 + A[3] = 1111111 0
pixel.2.blue  = 1111111 1 + A[2] = 1111111 0

pixel.3.red   = 1111111 1 + A[1] = 1111111 0
pixel.3.green = 1111111 1 + A[0] = 1111111 1

التعديل على البت الأول من كل لون في البكسل سيغير اللون لكن التغيير سيكون صغير جداً ولن تلاحظه العين، عند استرجاع الحرف فتقطع تلك البتات وتعيد تجميعها.

 

هذا تطبيق بسيط لإخفاء حرف واحد في الصورة، يمكنك فهمه وتعديله لإضافة نص كامل:

#-*- coding: utf-8 -*-
#!python

from PIL import Image

#################################################
# encoder
#################################################

img = Image.open('image.png')

pixels = img.load()
code = ord('A')

pixel1 = list(pixels[0, 0]) # 0 1 2
pixel2 = list(pixels[1, 0]) # 3 4 5
pixel3 = list(pixels[2, 0]) # 6 7

pixel1[0] = (pixel1[0] & 0xfe) | ((code >> 7) & 1) # 7
pixel1[1] = (pixel1[1] & 0xfe) | ((code >> 6) & 1) # 6
pixel1[2] = (pixel1[2] & 0xfe) | ((code >> 5) & 1) # 5

pixel2[0] = (pixel2[0] & 0xfe) | ((code >> 4) & 1) # 4
pixel2[1] = (pixel2[1] & 0xfe) | ((code >> 3) & 1) # 3
pixel2[2] = (pixel2[2] & 0xfe) | ((code >> 2) & 1) # 2

pixel3[0] = (pixel3[0] & 0xfe) | ((code >> 1) & 1) # 1
pixel3[1] = (pixel3[1] & 0xfe) | ( code       & 1) # 0


pixels[0, 0] = tuple(pixel1)
pixels[1, 0] = tuple(pixel2)
pixels[2, 0] = tuple(pixel3)

img.save('image2.png')
pixels = img.load()

#################################################
# decoder
#################################################

img = Image.open('image2.png')

pixels = img.load()

pixel1 = list(pixels[0, 0]) # 0 1 2
pixel2 = list(pixels[1, 0]) # 3 4 5
pixel3 = list(pixels[2, 0]) # 6 7

c = 0

c |= (pixel1[0] & 1) << 7 # 7
c |= (pixel1[1] & 1) << 6 # 6
c |= (pixel1[2] & 1) << 5 # 5

c |= (pixel2[0] & 1) << 4 # 4
c |= (pixel2[1] & 1) << 3 # 3
c |= (pixel2[2] & 1) << 2 # 2

c |= (pixel3[0] & 1) << 1 # 1
c |=  pixel3[1] & 1       # 0

print chr(c)

إذا لم تفهم تلك العمليات فيمكنك قراءة هذا المقال:

التعامل مع البتات والبايتات والعمليات المنطقية عليها
1
#11

بارك الله فيك أخي الكريم

 

تم القييم لن أنسى فضلك

 

جزاك الله خيرا

 

+

 

حسب ما طالعة عند طبع الصورة و اعادة قرائتها يمكن فقد النص المخفي 

 

هل هذا صحيح و لا يوجد حل ؟

 

هل يمكنني أن أسألك لماذا ال Qr code  لا يفسد عند طباعته ثم اعادة قرائته 

 

تحياتي أستاذي الفاضل

تم تعديل هذه المشاركة بواسطة Amin0u في 3 يناير 2014 في 06:51

#12
ساخبرك لماذا تفسد الصورة
كل ملف في الحاسوب هوعبارة مصفوفة ، المعلومات الخاصة بكل الملف نجدها عامة في البايتات الاولى لكل ملف او الهيدر وهذا يخلف من ملف لاخر
عندما تحقن النص في هذا المكان ، من الطبيعي ان يحدث اتلاف للصورة
 
اذا مايجب عليك فعله هو تحديد المكان الامن للحقن والذي يكون عامة قسم الداتا
وهذه الصورة توضح مختلف الاقسام في ملف MP4 ( هذا المثال للاخذ بعين الاعتبار فقط )
 
tcsteg.png
 
الامر معقد نوعا ما
لكن كالعادة دائما هناك مكتبة في بايثون تسهل الامر هي: stepic وهي خاصة بال steganographie
 
انصحك بالإطلاع على الكود الخاص بها بعد استعمالها
وهذا مثال لكيفية استخدامها
import Image
import stepic
import ezPyCrypto
افتح الصورة التي تريد اخفاء النص بداخلها
 im=Image.open("lena.jpg")
انشاء مفتاح لتشفير النص المراد اخفاءه داخل الصورة
 k=ezPyCrypto.key(2048)
enc=k.encStringToAscii('This is the hidden text')
اخفاء النص داخل الصورة وحفظها
im1=stepic.encode(enc)
im1.save('stegolena.jpg','JPEG')

ولاستخراج النص من داخل الصورة ، هذا مثال اخر

ملاحظة : يجب استخدام نفس المفتاح المستخدم في التشفير

import Image, stepic, ezPyCrypto 
im=Image.open("stegolena.jpg") 
data=stepic.decode(im)
k=ezPyCrypto(2048)
dec=k.decStringFromAscii(data)
print dec
This is the hidden text

اكرر .  الق نظرة على الكود الخاص بالمكتبة لتفهم اكثر

تم تعديل هذه المشاركة بواسطة med reda في 3 يناير 2014 في 15:10

1
#13

سأقوم بالاطلاع عليها  شكرا جزيلا لكن لم تفهم أخي معنى كلامي من " حسب ما طالعة عند طبع الصورة و اعادة قرائتها يمكن فقد النص المخفي "

يعني هل يمكن ان تتغير البكسلات عند طباعة الصورة و بالتالي تغير البيتات و هذا يؤدي الى فقدان النص  

الا يمكن الحفاظ على جودة الصورة عند طباعتها ؟

#14
لم افهم جيدا ما تقصد

لكن بالنسبة لجودة الصورة ، من الطبيعي ان تفقد جزء ا منها

1
#15

هذا المشكل الذي أواجهه 

 

فمثلا في Qr  كود يمكنك تشفير نص في شكل صورة ثم طباعته

 

و يمكنك قرائة الصورة عبر الكاميرا و فك تشفيرها ليعود النص بدون فقدان أي جزء منه

#16
الان فهمت واظن ان الاجابة بسيطة 

الـ QR او الكود بار ثنائي الابعاد يعتمد على الشكل العام للصورة وبالتالي لايكترث الا للمربعات التي تكون الصورة كاملة اذا لامجال للخطا

يعني مربع اسود او ابيض ولا شيء اخر

 

لمعالجة مشكلتك جرب عمل image binarization للصورة


اذا اردت معرفة كيفية ذلك يمكن ان اخبرك لاحقا

تم تعديل هذه المشاركة بواسطة med reda في 4 يناير 2014 في 00:57

#17

نعم جزاك الله خيرا

 

 ممكن تترك لي أي معلومة  هنا في هذا الموضوع

 

سوف أغيب عن المنتدى لمدة أسبوع بسبب الدراسة حيث الاقامة الجامعية بها مشاكل النت لذا لا يمكنني مطالعة ردود حتى الاسبوع القادم

 

تحياتي لكم و لكل من أفادني و بارك الله فيكم

مواضيع مشابهة