Hướng dẫn how to resize an image in python - cách thay đổi kích thước hình ảnh trong python

Giới thiệu

Nhiều ứng dụng sử dụng hình ảnh kỹ thuật số, và với điều này, thường cần phải xử lý các hình ảnh được sử dụng. Nếu bạn đang xây dựng ứng dụng của mình với Python và cần thêm các tính năng xử lý hình ảnh vào nó, có nhiều thư viện mà bạn có thể sử dụng. Một số người phổ biến là OpenCV, SCIKIT-IMAGE, PYTHON Hình ảnh và gối.

Chúng tôi sẽ không tranh luận về thư viện nào là tốt nhất ở đây; Họ đều có giá trị của họ. Bài viết này sẽ tập trung vào Gối, một thư viện mạnh mẽ cung cấp một loạt các tính năng xử lý hình ảnh và rất đơn giản để sử dụng.

Gối là một cái nĩa của Thư viện hình ảnh Python (PIL). PIL là một thư viện cung cấp một số quy trình tiêu chuẩn để thao tác hình ảnh. Đó là một thư viện mạnh mẽ nhưng chưa được cập nhật kể từ năm 2009 và không hỗ trợ Python 3. Gối xây dựng trên này, thêm nhiều tính năng và hỗ trợ cho Python 3. Nó hỗ trợ một loạt các định dạng tệp hình ảnh như PNG, JPEG, PPM, GIF, TIFF và BMP. Chúng ta sẽ xem cách thực hiện các hoạt động khác nhau trên các hình ảnh như cắt xén, thay đổi kích thước, thêm văn bản vào hình ảnh, xoay, gryscaling, v.v., sử dụng thư viện này.

Cài đặt và thiết lập dự án

Trước khi cài đặt gối, bạn nên biết điều sau đây:

  • Gối và PIL không thể cùng tồn tại trong cùng một môi trường, vì vậy trong trường hợp bạn đã cài đặt PIL, gỡ cài đặt nó trước khi tiến hành.
  • Chúng tôi sẽ sử dụng phiên bản Pillow ổn định hiện tại trong bài viết này (phiên bản 8.0.1 tại thời điểm viết). Phiên bản này yêu cầu Python phiên bản 3.6 trở lên.

Chúng tôi cung cấp hướng dẫn về cách cài đặt gối bên dưới, nhưng bạn nên kiểm tra hướng dẫn cài đặt trong trường hợp các phiên bản gối sau này tình cờ yêu cầu một số thư viện yêu cầu trước được cài đặt trước.

Bạn có thể cài đặt gối với

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
7 như được hiển thị:

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

Để làm theo, bạn có thể tải xuống các hình ảnh (lịch sự của Unplash) mà chúng tôi sẽ sử dụng trong bài viết. Bạn cũng có thể sử dụng hình ảnh của riêng bạn.

Tất cả các ví dụ sẽ cho rằng các hình ảnh cần thiết nằm trong cùng thư mục với tệp tập lệnh Python đang được chạy.

Đối tượng hình ảnh

Một lớp quan trọng trong thư viện hình ảnh Python là lớp

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8. Nó được xác định trong mô -đun
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8 và cung cấp hình ảnh PIL về việc có thể thực hiện các hoạt động thao tác nào. Một thể hiện của lớp này có thể được tạo theo nhiều cách: bằng cách tải hình ảnh từ một tệp, tạo hình ảnh từ đầu hoặc là kết quả của việc xử lý các hình ảnh khác. Chúng ta sẽ thấy tất cả những thứ này được sử dụng.

Để tải một hình ảnh từ một tệp, chúng tôi sử dụng hàm

image = Image.open('demo_image.jpg')
image.save('new_image.png')
0 trong mô -đun
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8, chuyển nó đường dẫn đến hình ảnh.

from PIL import Image

image = Image.open('demo_image.jpg')

Nếu thành công, các điều trên trả về một đối tượng

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8. Nếu có một vấn đề mở tệp, ngoại lệ
image = Image.open('demo_image.jpg')
image.save('new_image.png')
3 sẽ được nêu ra.

Sau khi có được một đối tượng

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8, giờ đây bạn có thể sử dụng các phương thức và thuộc tính được xác định bởi lớp để xử lý và thao tác nó. Hãy bắt đầu bằng cách hiển thị hình ảnh. Bạn có thể làm điều này bằng cách gọi phương thức
image = Image.open('demo_image.jpg')
image.save('new_image.png')
5 trên đó. Điều này hiển thị hình ảnh trên trình xem bên ngoài (thường là xem trước trên macOS, XV trên Unix và chương trình sơn trên Windows).

image.show()

Bạn có thể nhận được một số chi tiết về hình ảnh bằng các thuộc tính của đối tượng.

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None

Để biết thêm về những gì bạn có thể làm với lớp

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8, hãy xem tài liệu.

Thay đổi loại hình ảnh

Khi bạn hoàn thành việc xử lý một hình ảnh, bạn có thể lưu nó vào một tệp với phương thức

image = Image.open('demo_image.jpg')
image.save('new_image.png')
7, chuyển trong tên sẽ được sử dụng để dán nhãn tệp hình ảnh. Khi lưu một hình ảnh, bạn có thể chỉ định một tiện ích mở rộng khác với bản gốc của nó và hình ảnh đã lưu sẽ được chuyển đổi thành định dạng được chỉ định.

image = Image.open('demo_image.jpg')
image.save('new_image.png')

Trên đây tạo ra một đối tượng hình ảnh được tải với hình ảnh

image = Image.open('demo_image.jpg')
image.save('new_image.png')
8 và lưu nó vào một tệp mới,
image = Image.open('demo_image.jpg')
image.save('new_image.png')
9 Gối xem phần mở rộng tệp đã được chỉ định là PNG và do đó, nó chuyển đổi nó thành PNG trước khi lưu nó vào tệp. Bạn có thể cung cấp một đối số thứ hai cho
image = Image.open('demo_image.jpg')
image.save('new_image.png')
7 để chỉ định rõ ràng định dạng tệp.
image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
1 này sẽ làm điều tương tự như
image = Image.open('demo_image.jpg')
image.save('new_image.png')
7 trước đó. Thông thường, không cần thiết phải cung cấp đối số thứ hai này vì gối sẽ xác định định dạng lưu trữ tệp để sử dụng từ tiện ích mở rộng tên tệp, nhưng nếu bạn đang sử dụng các tiện ích mở rộng không chuẩn, thì bạn phải luôn chỉ định định dạng theo cách này.

Thay đổi kích thước hình ảnh

Để thay đổi kích thước một hình ảnh, bạn gọi phương thức

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
3 trên nó, chuyển theo đối số tuple hai số nguyên đại diện cho chiều rộng và chiều cao của hình ảnh thay đổi kích thước. Hàm không sửa đổi hình ảnh đã sử dụng; Thay vào đó, nó trả về một hình ảnh khác với kích thước mới.

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)

Phương thức

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
3 trả về một hình ảnh có chiều rộng và chiều cao khớp chính xác với giá trị được truyền. Đây có thể là những gì bạn muốn, nhưng đôi khi bạn có thể thấy rằng các hình ảnh được trả lại bởi chức năng này không lý tưởng. Điều này chủ yếu là do hàm không tính đến tỷ lệ khung hình của hình ảnh, do đó bạn có thể kết thúc với một hình ảnh trông có vẻ kéo dài hoặc bị vắt.

Bạn có thể thấy điều này trong hình ảnh mới được tạo từ mã trên:

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
5. Nó trông hơi vắt theo chiều ngang.

Hướng dẫn how to resize an image in python - cách thay đổi kích thước hình ảnh trong python

Nếu bạn muốn thay đổi kích thước hình ảnh và giữ tỷ lệ khung hình của chúng, thì thay vào đó bạn nên sử dụng hàm

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
6 để thay đổi kích thước chúng. Điều này cũng có một đối số tuple hai số nguyên thể hiện chiều rộng tối đa và chiều cao tối đa của hình thu nhỏ.

image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)

Trên đây sẽ dẫn đến một hình ảnh có kích thước 400x267, đã giữ tỷ lệ khung hình của hình ảnh gốc. Như bạn có thể thấy dưới đây, điều này dẫn đến một hình ảnh đẹp hơn.

Một sự khác biệt đáng kể khác giữa các hàm

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
3 và
image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
6 là hàm
image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
3 'thổi bay' một hình ảnh nếu các tham số được đưa ra lớn hơn hình ảnh gốc, trong khi hàm
image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
6 không. Ví dụ, được đưa ra một hình ảnh có kích thước 400x200, một cuộc gọi đến
image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
1 sẽ tạo ra một hình ảnh có kích thước lớn hơn 1200x600; Do đó, hình ảnh sẽ mất một số định nghĩa và có khả năng bị mờ so với bản gốc. Mặt khác, cuộc gọi đến
image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
2 bằng hình ảnh gốc sẽ dẫn đến hình ảnh giữ kích thước 400x200 của nó vì cả chiều rộng và chiều cao đều nhỏ hơn chiều rộng và chiều cao tối đa được chỉ định.

Cắt xén

Khi một hình ảnh được cắt, một vùng hình chữ nhật bên trong hình ảnh được chọn và giữ lại trong khi mọi thứ khác bên ngoài khu vực bị loại bỏ. Với thư viện gối, bạn có thể cắt một hình ảnh bằng phương pháp

image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
3 của lớp
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8. Phương pháp lấy một bộ hộp xác định vị trí và kích thước của vùng bị cắt và trả về một đối tượng
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8 đại diện cho hình ảnh bị cắt. Các tọa độ cho hộp là (trái, trên, phải, thấp hơn). Phần cắt bao gồm cột bên trái và hàng trên của pixel và đi lên (nhưng không bao gồm) cột bên phải và hàng dưới cùng của pixel. Điều này được giải thích tốt hơn với một ví dụ.

image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)

Đây là hình ảnh kết quả:

Thư viện hình ảnh Python sử dụng một hệ tọa độ bắt đầu bằng (0, 0) ở góc trên bên trái. Hai giá trị đầu tiên của hộp hộp chỉ định vị trí bắt đầu phía trên bên trái của hộp crop. Các giá trị thứ ba và thứ tư xác định khoảng cách tính theo pixel từ vị trí bắt đầu này về phía hướng bên phải và dưới cùng. Các tọa độ đề cập đến các vị trí giữa các pixel, vì vậy vùng trong ví dụ trên là chính xác là 500x300 pixel.

Dán một hình ảnh lên một hình ảnh khác

Gối cho phép bạn dán một hình ảnh lên một hình ảnh khác. Một số trường hợp sử dụng ví dụ trong đó điều này có thể hữu ích trong việc bảo vệ các hình ảnh có sẵn công khai bằng cách thêm các hình mờ trên chúng, việc xây dựng thương hiệu hình ảnh bằng cách thêm logo của công ty và trong bất kỳ trường hợp nào khác cần phải hợp nhất hai hình ảnh.

Dán được thực hiện với hàm

image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
6. Điều này sửa đổi đối tượng
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8 tại chỗ, không giống như các chức năng xử lý khác mà chúng tôi đã xem xét cho đến nay trả về một đối tượng
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8 mới. Bởi vì điều này, trước tiên chúng tôi sẽ tạo một bản sao của hình ảnh demo của chúng tôi trước khi thực hiện dán để chúng tôi có thể tiếp tục với các ví dụ khác với một hình ảnh không biến đổi.

image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')

Ở trên, chúng tôi tải trong hai hình ảnh,

image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
9 và
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
0, sau đó tạo một bản sao của cái trước với
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
1. Chúng tôi muốn dán hình ảnh logo lên hình ảnh được sao chép và chúng tôi muốn nó được đặt ở góc dưới bên phải. Điều này được tính toán và lưu trong một tuple. Tuple có thể là 2-tuple cho góc trên bên trái, 4-tuple xác định tọa độ bên trái, trên, phải và dưới tọa độ pixel hoặc
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
2 (giống như (0, 0)). Sau đó, chúng tôi chuyển phần này cho
image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
6 cùng với hình ảnh sẽ được dán.

Bạn có thể thấy kết quả dưới đây.

Đó không phải là kết quả mà chúng tôi đã mong đợi.

Theo mặc định, khi bạn thực hiện dán, các pixel trong suốt được dán dưới dạng pixel rắn, do đó hộp màu đen (màu trắng trên một số OSS) xung quanh logo. Hầu hết thời gian, đây không phải là điều bạn muốn. Bạn không thể có hình mờ bao gồm nội dung hình ảnh cơ bản. Chúng tôi thà có các pixel trong suốt xuất hiện như vậy.

Để đạt được điều này, bạn cần chuyển trong một đối số thứ ba cho hàm

image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
6. Đối số này là đối tượng hình ảnh mặt nạ minh bạch. Mặt nạ là một đối tượng hình ảnh trong đó giá trị alpha có ý nghĩa, nhưng các giá trị màu xanh lá cây, đỏ và xanh của nó bị bỏ qua. Nếu mặt nạ được đưa ra,
image = Image.open('demo_image.jpg')
image.thumbnail((400, 400))
image.save('image_thumbnail.jpg')

print(image.size) # Output: (400, 267)
6 chỉ cập nhật các vùng được chỉ định bởi mặt nạ. Bạn có thể sử dụng hình ảnh
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
6,
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
7 hoặc
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
8 cho mặt nạ. Dán hình ảnh RGBA và cũng sử dụng nó làm mặt nạ sẽ dán phần mờ của hình ảnh nhưng không phải là nền trong suốt của nó. Nếu bạn sửa đổi dán như hình dưới đây, bạn nên có một logo dán với pixel trong suốt.

image_copy.paste(logo, position, logo)

Hình ảnh quay

Bạn có thể xoay hình ảnh bằng gối bằng phương pháp

image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
9. Điều này có một đối số số nguyên hoặc float biểu thị các độ để xoay một hình ảnh và trả về một đối tượng hình ảnh mới của hình ảnh được xoay. Việc xoay được thực hiện ngược chiều kim đồng hồ.

from PIL import Image

image = Image.open('demo_image.jpg')
0

Ở trên, chúng tôi lưu hai hình ảnh vào đĩa: một hình quay ở 90 độ, hình kia ở 180. Các hình ảnh kết quả được hiển thị bên dưới.

Theo mặc định, hình ảnh xoay giữ kích thước của hình ảnh gốc. Điều này có nghĩa là đối với các góc khác với bội số của 180, hình ảnh sẽ được cắt và/hoặc đệm để phù hợp với kích thước ban đầu. Nếu bạn nhìn kỹ vào hình ảnh đầu tiên ở trên, bạn sẽ nhận thấy rằng một số trong đó đã được cắt để phù hợp với chiều cao ban đầu và các cạnh của nó đã được đệm với nền đen (pixel trong suốt trên một số OSS) để phù hợp với chiều rộng ban đầu. Ví dụ dưới đây cho thấy điều này rõ ràng hơn.

from PIL import Image

image = Image.open('demo_image.jpg')
1

Hình ảnh kết quả được hiển thị bên dưới:

Để mở rộng kích thước của hình ảnh xoay để phù hợp với toàn bộ chế độ xem, bạn chuyển một đối số thứ hai sang

image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
9 như hình dưới đây.

from PIL import Image

image = Image.open('demo_image.jpg')
2

Bây giờ nội dung của hình ảnh sẽ được hiển thị đầy đủ và kích thước của hình ảnh sẽ tăng lên để tính đến điều này.

Lật hình ảnh

Bạn cũng có thể lật hình ảnh để có được phiên bản gương của họ. Điều này được thực hiện với hàm

image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
1. Phải mất một trong các tùy chọn sau:
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
2,
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
3,
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
4,
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
5,
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
6
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
7 hoặc
image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
8.

from PIL import Image

image = Image.open('demo_image.jpg')
3

Hình ảnh kết quả có thể được nhìn thấy dưới đây.

Vẽ trên hình ảnh

Với gối, bạn cũng có thể vẽ trên một hình ảnh bằng mô -đun hình ảnh. Bạn có thể vẽ các đường, điểm, hình elip, hình chữ nhật, vòng cung, bitmap, hợp âm, lát bánh, đa giác, hình dạng và văn bản.

from PIL import Image

image = Image.open('demo_image.jpg')
4

Trong ví dụ, chúng tôi tạo một đối tượng hình ảnh với phương thức

image = Image.open('demo_image.jpg')
logo = Image.open('logo.png')
image_copy = image.copy()
position = ((image_copy.width - logo.width), (image_copy.height - logo.height))
image_copy.paste(logo, position)
image_copy.save('pasted_image.jpg')
9. Điều này trả về một đối tượng
# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
8 không có hình ảnh được tải. Sau đó chúng tôi thêm một hình chữ nhật và một số văn bản vào hình ảnh trước khi lưu nó.

Biến đổi màu

Chuyển đổi giữa các chế độ

Thư viện gối cho phép bạn chuyển đổi hình ảnh giữa các biểu diễn pixel khác nhau bằng phương pháp

image_copy.paste(logo, position, logo)
1. Nó hỗ trợ chuyển đổi giữa các chế độ
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
7 (Greyscale),
image_copy.paste(logo, position, logo)
3 và
image_copy.paste(logo, position, logo)
4.

Trong ví dụ dưới đây, chúng tôi chuyển đổi hình ảnh từ chế độ

image_copy.paste(logo, position, logo)
3 thành
image = Image.open('demo_image.jpg')
box = (200, 300, 700, 600)
cropped_image = image.crop(box)
cropped_image.save('cropped_image.jpg')

# Print size of cropped image
print(cropped_image.size) # Output: (500, 300)
7 (độ chói), sẽ dẫn đến hình ảnh màu xám.

from PIL import Image

image = Image.open('demo_image.jpg')
5

Tách và hợp nhất các dải

Bạn cũng có thể chia một hình ảnh nhiều băng tần (chẳng hạn như RGB) thành các dải riêng lẻ bằng phương pháp

image_copy.paste(logo, position, logo)
7.
image_copy.paste(logo, position, logo)
7 Tạo hình ảnh mới, mỗi hình chứa một dải từ hình ảnh gốc.

Bạn có thể hợp nhất một tập hợp các hình ảnh băng đơn thành một hình ảnh đa băng tần mới bằng cách sử dụng hàm

image_copy.paste(logo, position, logo)
9.
image_copy.paste(logo, position, logo)
9 có một chế độ và một bộ ảnh hình ảnh và kết hợp chúng thành một hình ảnh mới.

from PIL import Image

image = Image.open('demo_image.jpg')
6

Trong mã trên, chúng tôi chia một hình ảnh RGB thành các dải riêng lẻ, trao đổi chúng và sau đó hợp nhất chúng. Dưới đây là hình ảnh kết quả.

Cải tiến hình ảnh

Gối cho phép bạn tăng cường hình ảnh bằng cách điều chỉnh độ tương phản, màu sắc, độ sáng và độ sắc nét của nó bằng cách sử dụng các lớp trong mô -đun

from PIL import Image

image = Image.open('demo_image.jpg')
01.

from PIL import Image

image = Image.open('demo_image.jpg')
7

Ở trên, chúng tôi điều chỉnh độ tương phản hình ảnh theo hệ số

from PIL import Image

image = Image.open('demo_image.jpg')
02. Yếu tố được sử dụng trong các lớp nâng cao là một giá trị dấu phẩy động xác định mức độ tăng cường. Một hệ số
from PIL import Image

image = Image.open('demo_image.jpg')
03 trả về một bản sao của hình ảnh gốc; Các yếu tố thấp hơn có nghĩa là ít hơn của sự tăng cường cụ thể và giá trị cao hơn nhiều hơn. Không có hạn chế đối với giá trị này.

Bạn có thể thấy hình ảnh nâng cao dưới đây.

Dưới đây, chúng tôi tăng màu của hình ảnh. Nếu chúng ta sử dụng hệ số

from PIL import Image

image = Image.open('demo_image.jpg')
04, chúng ta sẽ có được hình ảnh đen trắng.

from PIL import Image

image = Image.open('demo_image.jpg')
8

Dưới đây chúng tôi làm cho hình ảnh sáng hơn. Một yếu tố của

from PIL import Image

image = Image.open('demo_image.jpg')
04 sẽ tạo ra một hình ảnh màu đen.

from PIL import Image

image = Image.open('demo_image.jpg')
9

Dưới đây chúng tôi làm cho hình ảnh sắc nét hơn. Một yếu tố tăng cường của

from PIL import Image

image = Image.open('demo_image.jpg')
04 sẽ tạo ra một hình ảnh mờ và hệ số
from PIL import Image

image = Image.open('demo_image.jpg')
07 sẽ cho một hình ảnh được mài giũa.

image.show()
0

Ngoài ra: Thêm xác thực Auth0 vào ứng dụng Python

Trước khi kết thúc bài viết, chúng ta hãy xem cách bạn có thể thêm xác thực bằng Auth0 vào ứng dụng Python. Ứng dụng chúng ta sẽ xem xét được tạo bằng bình, nhưng quy trình này tương tự đối với các khung web Python khác.

Thay vì tạo một ứng dụng từ đầu, tôi đã kết hợp một ứng dụng đơn giản mà bạn có thể tải xuống để theo dõi. Đây là một ứng dụng thư viện đơn giản cho phép người dùng tải hình ảnh lên máy chủ và xem các hình ảnh đã tải lên.

Nếu bạn đã tải xuống các tệp dự án, bạn sẽ tìm thấy hai thư mục bên trong thư mục chính:

from PIL import Image

image = Image.open('demo_image.jpg')
08 và
from PIL import Image

image = Image.open('demo_image.jpg')
09. Đúng như tên gọi,
from PIL import Image

image = Image.open('demo_image.jpg')
08 là dự án chúng ta sẽ bắt đầu và thêm Auth0 vào.

Để chạy mã, tốt hơn là tạo một môi trường ảo và cài đặt các gói cần thiết ở đó. Điều này ngăn chặn sự lộn xộn của gói và xung đột phiên bản trong trình thông dịch Python toàn cầu của hệ thống.

Chúng tôi sẽ tạo ra một môi trường ảo với Python 3. Phiên bản này hỗ trợ môi trường ảo một cách tự nhiên và không yêu cầu tải xuống một tiện ích bên ngoài (VirtualEnv), như trường hợp của Python 2.7.

Sau khi tải xuống các tệp mã, hãy thay đổi thiết bị đầu cuối của bạn để trỏ đến thư mục

from PIL import Image

image = Image.open('demo_image.jpg')
11.

image.show()
1

Tạo môi trường ảo với lệnh sau.

image.show()
2

Sau đó kích hoạt nó với (trên macOS và Linux):

image.show()
3

Trên Windows:

image.show()
4

Để hoàn tất thiết lập, hãy cài đặt các gói được liệt kê trong tệp aborment.txt với:

image.show()
5

Điều này sẽ cài đặt

from PIL import Image

image = Image.open('demo_image.jpg')
12,
from PIL import Image

image = Image.open('demo_image.jpg')
13,
from PIL import Image

image = Image.open('demo_image.jpg')
14,
from PIL import Image

image = Image.open('demo_image.jpg')
15,
from PIL import Image

image = Image.open('demo_image.jpg')
16,
from PIL import Image

image = Image.open('demo_image.jpg')
17 và các phụ thuộc của chúng. Khi
from PIL import Image

image = Image.open('demo_image.jpg')
13 được cài đặt, bạn có thể nhận được thông báo lỗi trong lần đọc thiết bị đầu cuối của mình
from PIL import Image

image = Image.open('demo_image.jpg')
19. Từ những gì tôi đã thấy, các gói cần thiết sẽ được cài đặt và thiết lập được thực hiện mà bạn cần phải làm bất cứ điều gì (bạn sẽ thấy thông báo
from PIL import Image

image = Image.open('demo_image.jpg')
20 trong thiết bị đầu cuối).
from PIL import Image

image = Image.open('demo_image.jpg')
13 sẽ được cài đặt thành công và dự án demo sẽ hoạt động tốt. Bạn có thể đọc thêm về thông báo lỗi ở đây

Sau đó, cuối cùng, chạy ứng dụng.

image.show()
6

Mở http: // localhost: 3000/trong trình duyệt của bạn và bạn sẽ xem trang sau.

Khi bạn đi đến http: // localhost: 3000/gallery, bạn sẽ thấy một trang trống. Bạn có thể đi đến http: // localhost: 3000/tải lên và tải lên một số hình ảnh sau đó sẽ xuất hiện trong bộ sưu tập.

Khi một hình ảnh được tải lên, một bản sao nhỏ hơn của nó được tạo bằng hàm

image = Image.open('demo_image.jpg')
new_image = image.resize((400, 400))
new_image.save('image_400.jpg')

print(image.size) # Output: (1920, 1280)
print(new_image.size) # Output: (400, 400)
6 mà chúng tôi đã xem trước đó, sau đó hai hình ảnh được lưu - bản gốc vào thư mục
from PIL import Image

image = Image.open('demo_image.jpg')
23 và thư mục
from PIL import Image

image = Image.open('demo_image.jpg')
24 vào hình thu nhỏ.

Bộ sưu tập hiển thị các hình thu nhỏ có kích thước nhỏ hơn và chỉ hiển thị hình ảnh lớn hơn (bên trong một phương thức) khi nhấp vào hình thu nhỏ.

Khi ứng dụng đứng, bất kỳ người dùng nào cũng có thể tải lên một hình ảnh. Điều này có thể không lý tưởng. Có thể tốt hơn là đặt một số bảo vệ đối với hành động này để ngăn chặn lạm dụng hoặc ít nhất là theo dõi tải lên người dùng. Đây là nơi Auth0 xuất hiện. Với Auth0, chúng tôi sẽ có thể thêm xác thực vào ứng dụng với số lượng công việc tối thiểu.

Để đơn giản của ứng dụng, hầu hết các chức năng của nó nằm trong tệp

from PIL import Image

image = Image.open('demo_image.jpg')
25. Ở đây, bạn có thể thấy các trình xử lý tuyến đường thiết lập. Hàm
from PIL import Image

image = Image.open('demo_image.jpg')
26 xử lý các cuộc gọi đến
from PIL import Image

image = Image.open('demo_image.jpg')
27. Đây là nơi hình ảnh được xử lý trước khi được lưu. Chúng tôi sẽ bảo mật tuyến đường này với Auth0.

image.show()
7

Thiết lập Auth0

Để thiết lập ứng dụng với AUTH0, trước tiên hãy đăng ký tài khoản AUTH0, sau đó điều hướng đến bảng điều khiển. Nhấp vào nút Tạo ứng dụng và điền tên của ứng dụng (hoặc để nó mặc định). Chọn các ứng dụng web thông thường từ danh sách loại ứng dụng, sau đó tạo ứng dụng.Create Application button and fill in the name of the application (or leave it at its default). Select Regular Web Applications from the application type list, then Create the application.

Xin lưu ý:

Nếu bạn được đưa đến màn hình bắt đầu, nhấp vào nút Tạo ứng dụng, nằm trong khu vực được dán nhãn tích hợp Auth0 vào ứng dụng của bạn. Bạn sẽ được đưa đến công nghệ nào bạn đang sử dụng cho dự án của mình? Màn hình, ở đây chỉ cần nhấp vào nút Bỏ qua tích hợp, sẽ đưa bạn đến tab Cài đặt cho ứng dụng, nơi bạn có thể truy cập ID máy khách, Bí mật máy khách và tên miền.Getting Started screen, click on the Create Application button, which is in the area labeled Integrate Auth0 into your application. You will be taken to the What technology are you using for your project? screen, in here just click the Skip Integration button, which will take you to the Settings tab for the application, where you can access the client ID, client secret, and domain.

Sau khi ứng dụng đã được tạo, có thể truy xuất tab Cài đặt trong đó ID máy khách, Bí mật máy khách và tên miền có thể được truy xuất. Đặt URL gọi lại được phép thành

from PIL import Image

image = Image.open('demo_image.jpg')
28 và cho phép đăng xuất URL thành
from PIL import Image

image = Image.open('demo_image.jpg')
29 sau đó lưu các thay đổi bằng nút ở cuối trang.Settings tab where the client ID, Client Secret, and Domain can be retrieved. Set the Allowed Callback URLs to
from PIL import Image

image = Image.open('demo_image.jpg')
28 and Allowed Logout URLs to
from PIL import Image

image = Image.open('demo_image.jpg')
29 then save the changes with the button at the bottom of the page.

Quay trở lại dự án của bạn, tạo một tệp có nhãn

from PIL import Image

image = Image.open('demo_image.jpg')
30 và lưu nó ở gốc của dự án. Thêm thông tin đăng nhập máy khách AUTH0 của bạn vào tệp này. Nếu bạn đang sử dụng phiên bản, hãy nhớ không đặt tệp này theo phiên bản. Chúng tôi sẽ sử dụng giá trị của
from PIL import Image

image = Image.open('demo_image.jpg')
31 làm khóa bí mật của ứng dụng. Bạn có thể/nên thay đổi nó.

image.show()
8

Thêm một tệp khác có tên

from PIL import Image

image = Image.open('demo_image.jpg')
32 vào thư mục gốc của dự án và thêm các hằng số sau vào nó.

image.show()
9

Tiếp theo, sửa đổi phần đầu của tệp

from PIL import Image

image = Image.open('demo_image.jpg')
25 như được hiển thị - từ câu lệnh đầu tiên đến điểm ngay trước định nghĩa tuyến đầu tiên (
from PIL import Image

image = Image.open('demo_image.jpg')
34).

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
0

Chúng tôi sử dụng

from PIL import Image

image = Image.open('demo_image.jpg')
35 để tải các biến môi trường từ tệp
from PIL import Image

image = Image.open('demo_image.jpg')
30.

Sau đó chúng tôi đặt ứng dụng

from PIL import Image

image = Image.open('demo_image.jpg')
37. Ứng dụng sẽ sử dụng các phiên, cho phép lưu trữ thông tin cụ thể cho người dùng từ yêu cầu này sang yêu cầu tiếp theo. Điều này được thực hiện trên đầu cookie và ký các cookie bằng mật mã. Điều này có nghĩa là ai đó có thể nhìn vào nội dung của cookie của bạn nhưng không thể tìm ra thông tin cơ bản hoặc để sửa đổi thành công nó trừ khi họ biết khóa bí mật được sử dụng để ký.

Tiếp theo, chúng tôi lưu thông tin xác thực AUTH0 của chúng tôi trong một số hằng số mà chúng tôi sẽ sử dụng sau này và thêm trình xử lý lỗi (

from PIL import Image

image = Image.open('demo_image.jpg')
38). Chúng tôi sử dụng trình trang trí
from PIL import Image

image = Image.open('demo_image.jpg')
39 trên trình xử lý lỗi của chúng tôi, cấu hình bình để gọi chức năng này khi các trường hợp ngoại lệ của loại
from PIL import Image

image = Image.open('demo_image.jpg')
40 được nâng lên. Trình xử lý lỗi làm cho lỗi dễ đọc hơn bằng cách đặt chúng vào đối tượng JSON.

Sau đó, chúng tôi khởi tạo một ứng dụng khách OAuth của Flask và đăng ký ứng dụng của chúng tôi.

Tiếp theo, thêm các chức năng sau vào tệp

from PIL import Image

image = Image.open('demo_image.jpg')
25 trước các định nghĩa xử lý tuyến đường.
from PIL import Image

image = Image.open('demo_image.jpg')
42 phải đến trước bất kỳ định nghĩa xử lý tuyến đường nào nếu không lỗi
from PIL import Image

image = Image.open('demo_image.jpg')
43 sẽ được nêu ra.

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
1

Ở đây chúng tôi xác định một trình trang trí sẽ đảm bảo rằng người dùng được xác thực trước khi họ có thể truy cập một tuyến đường cụ thể. Hàm thứ hai chỉ đơn giản là trả về

from PIL import Image

image = Image.open('demo_image.jpg')
44 hoặc
from PIL import Image

image = Image.open('demo_image.jpg')
45 tùy thuộc vào việc có một số dữ liệu người dùng từ AUTH0 được lưu trữ trong đối tượng phiên.

Tiếp theo, sửa đổi các hàm

from PIL import Image

image = Image.open('demo_image.jpg')
46 và
from PIL import Image

image = Image.open('demo_image.jpg')
26 như được hiển thị.

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
2

Trong

from PIL import Image

image = Image.open('demo_image.jpg')
46, chúng tôi chuyển một số biến cho mẫu
from PIL import Image

image = Image.open('demo_image.jpg')
49. Chúng tôi sẽ sử dụng những thứ này sau này.

Chúng tôi thêm bộ trang trí

from PIL import Image

image = Image.open('demo_image.jpg')
50 vào hàm
from PIL import Image

image = Image.open('demo_image.jpg')
26. Điều này sẽ đảm bảo rằng các cuộc gọi đến
from PIL import Image

image = Image.open('demo_image.jpg')
27 chỉ có thể thành công nếu người dùng được đăng nhập. Không chỉ người dùng không được xác thực không thể truy cập trang
from PIL import Image

image = Image.open('demo_image.jpg')
53 mà còn không thể đăng dữ liệu lên tuyến đường.

Ở cuối hàm, chúng tôi chuyển biến

from PIL import Image

image = Image.open('demo_image.jpg')
54 cho mẫu
from PIL import Image

image = Image.open('demo_image.jpg')
53.

Tiếp theo, thêm chức năng sau vào tệp.

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
3

Trên đây sẽ được gọi bởi máy chủ AUTH0 sau khi xác thực người dùng. Đó là đường dẫn mà chúng tôi đã thêm vào các URL gọi lại trên bảng điều khiển Auth0. Trình xử lý trao đổi mã mà Auth0 gửi đến URL gọi lại để biết mã thông báo truy cập và mã thông báo ID. Mã thông báo truy cập được sử dụng để gọi điểm cuối

from PIL import Image

image = Image.open('demo_image.jpg')
56 để lấy hồ sơ người dùng. Sau khi thu được thông tin người dùng, chúng tôi lưu trữ nó trong đối tượng
from PIL import Image

image = Image.open('demo_image.jpg')
57. Kiểm tra tài liệu để xem thông tin người dùng khác được trả về bởi /userInfoAllowed Callback URLs on the Auth0 Dashboard. The handler exchanges the code that Auth0 sends to the callback URL for an Access Token and an ID Token. The Access Token is used to call the
from PIL import Image

image = Image.open('demo_image.jpg')
56 endpoint to get the user profile. After user information is obtained, we store it in the
from PIL import Image

image = Image.open('demo_image.jpg')
57 object. Check the documentation to see the other user information returned by /userinfo

Sửa đổi

from PIL import Image

image = Image.open('demo_image.jpg')
58 như hình dưới đây.

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
4

Ở trên, chúng tôi kiểm tra trạng thái đăng nhập của người dùng và hiển thị một tin nhắn khác cho phù hợp. Chúng tôi cũng thêm một liên kết đăng xuất nếu người dùng được đăng nhập.

Để xác thực, ứng dụng sẽ sử dụng đăng nhập Universal của Auth0. Điều này sẽ trình bày một biểu mẫu đăng nhập/đăng ký/có thể tùy chỉnh, nhưng có thể tùy chỉnh.

Thêm hai tuyến sau vào

from PIL import Image

image = Image.open('demo_image.jpg')
25

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
5

Trong

from PIL import Image

image = Image.open('demo_image.jpg')
60, chúng tôi gọi hàm
from PIL import Image

image = Image.open('demo_image.jpg')
61 được sử dụng để đăng nhập người dùng thông qua đăng nhập Universal. Nó có một URL chuyển hướng, Auth0 chuyển hướng trình duyệt sau khi ủy quyền đã được cấp cho người dùng.

Chúng tôi cũng thêm một tuyến đường sẽ đăng xuất người dùng. Khi triển khai chức năng đăng xuất trong một ứng dụng, thường có ba lớp phiên bạn cần xem xét:

  • Phiên ứng dụng: Đầu tiên là phiên bên trong ứng dụng. Mặc dù ứng dụng của bạn sử dụng Auth0 để xác thực người dùng, bạn vẫn sẽ cần theo dõi thực tế là người dùng đã đăng nhập vào ứng dụng của bạn. Trong một ứng dụng web bình thường, điều này đạt được bằng cách lưu trữ thông tin bên trong cookie. Bạn cần đăng xuất người dùng từ ứng dụng của mình bằng cách xóa phiên của họ.: The first is the session inside the application. Even though your application uses Auth0 to authenticate users, you will still need to keep track of the fact that the user has logged in to your application. In a normal web application, this is achieved by storing information inside a cookie. You need to log out the user from your application by clearing their session.
  • Phiên Auth0: Tiếp theo, Auth0 cũng sẽ giữ một phiên và lưu trữ thông tin của người dùng bên trong cookie. Lần tới khi người dùng được chuyển hướng đến màn hình đăng nhập AUTH0, thông tin của người dùng sẽ được ghi nhớ. Để đăng xuất người dùng từ Auth0, bạn cần xóa Cookie SSO.: Next, Auth0 will also keep a session and store the user's information inside a cookie. Next time when a user is redirected to the Auth0 login screen, the user's information will be remembered. In order to logout a user from Auth0, you need to clear the SSO cookie.
  • Phiên nhà cung cấp nhận dạng: Lớp cuối cùng là nhà cung cấp nhận dạng, ví dụ: Facebook hoặc Google. Khi bạn cho phép người dùng đăng nhập với bất kỳ nhà cung cấp nào trong số này và họ đã được đăng nhập vào nhà cung cấp, họ sẽ không được nhắc đăng nhập. Họ có thể chỉ cần cấp quyền để chia sẻ thông tin của họ với Auth0 và lần lượt, Ứng dụng của bạn.: The last layer is the Identity Provider, for example, Facebook or Google. When you allow users to sign in with any of these providers, and they are already signed into the provider, they will not be prompted to sign in. They may simply be required to give permissions to share their information with Auth0 and, in turn, your application.

Trong mã trên, chúng tôi đối phó với hai cái đầu tiên. Nếu chúng tôi chỉ xóa phiên với

from PIL import Image

image = Image.open('demo_image.jpg')
62, thì người dùng sẽ được đăng xuất khỏi ứng dụng, nhưng họ sẽ không được đăng xuất khỏi Auth0. Khi sử dụng lại ứng dụng, xác thực sẽ được yêu cầu để tải lên hình ảnh. Nếu họ cố gắng đăng nhập, tiện ích đăng nhập sẽ hiển thị tài khoản người dùng được đăng nhập trên Auth0 và người dùng sẽ chỉ phải nhấp vào email để lấy Auth0 để gửi thông tin đăng nhập của họ trở lại ứng dụng, sau đó sẽ được lưu đến đối tượng phiên. Tại đây, người dùng sẽ không được yêu cầu nhập lại mật khẩu của họ.

Bạn có thể thấy vấn đề ở đây. Sau khi người dùng đăng xuất khỏi ứng dụng, một người dùng khác có thể đăng nhập khi chúng trên máy tính đó. Vì vậy, cũng cần phải đăng nhập người dùng ra khỏi Auth0. Điều này được thực hiện với chuyển hướng đến

from PIL import Image

image = Image.open('demo_image.jpg')
63. Chuyển hướng người dùng đến URL này xóa tất cả các cookie đăng nhập một lần do Auth0 đặt cho người dùng.

Mặc dù không phải là một thông lệ phổ biến, bạn có thể buộc người dùng cũng phải đăng xuất khỏi nhà cung cấp danh tính của họ bằng cách thêm tham số

from PIL import Image

image = Image.open('demo_image.jpg')
64 Truy vấnString vào URL đăng xuất:
from PIL import Image

image = Image.open('demo_image.jpg')
65.

Chúng tôi thêm một tham số

from PIL import Image

image = Image.open('demo_image.jpg')
66 vào URL có giá trị là URL mà Auth0 sẽ chuyển hướng đến sau khi đăng xuất người dùng. Để hoạt động này, URL phải được thêm vào URL đăng xuất được phép trên bảng điều khiển Auth0, mà chúng tôi đã làm trước đó.Allowed Logout URLs on the Auth0 Dashboard, which we did earlier.

Cuối cùng, trong

from PIL import Image

image = Image.open('demo_image.jpg')
67, bạn có thể thêm các mục sau trước thẻ
from PIL import Image

image = Image.open('demo_image.jpg')
68.

# The file format of the source file.
print(image.format) # Output: JPEG

# The pixel format used by the image. Typical values are "1", "L", "RGB", or "CMYK."
print(image.mode) # Output: RGB

# Image size, in pixels. The size is given as a 2-tuple (width, height).
print(image.size) # Output: (1920, 1280)

# Colour palette table, if any.
print(image.palette) # Output: None
6

Điều này sẽ hiển thị tên người dùng đã đăng nhập. Nhìn vào hồ sơ người dùng để xem những gì thông tin người dùng khác có sẵn cho bạn. Thông tin có sẵn sẽ được xác định bởi những gì được lưu trên máy chủ. Chẳng hạn, nếu người dùng chỉ sử dụng xác thực email/mật khẩu, thì bạn sẽ không thể nhận được

from PIL import Image

image = Image.open('demo_image.jpg')
69 của họ (tên của họ sẽ là giá trị trước
from PIL import Image

image = Image.open('demo_image.jpg')
70 trong email của họ) hoặc
from PIL import Image

image = Image.open('demo_image.jpg')
71, nhưng nếu họ sử dụng một trong những Các nhà cung cấp danh tính như Facebook hoặc Google, sau đó bạn có thể nhận được dữ liệu này.

Chạy ứng dụng. Bạn sẽ không thể có được biểu mẫu tải lên bằng cách điều hướng đến

from PIL import Image

image = Image.open('demo_image.jpg')
27. Đi đến trang chủ và sử dụng liên kết đăng nhập để hiển thị tiện ích đăng nhập.

Sau khi xác thực, bạn sẽ được chuyển hướng đến trang

from PIL import Image

image = Image.open('demo_image.jpg')
73.

Sự kết luận

Trong bài viết này, chúng tôi đã đề cập đến một số hoạt động xử lý hình ảnh phổ biến hơn được tìm thấy trong các ứng dụng. Gối là một thư viện mạnh mẽ, và chúng tôi chắc chắn đã không thảo luận tất cả những gì nó có thể làm. Nếu bạn muốn tìm hiểu thêm, hãy chắc chắn đọc tài liệu.

Nếu bạn đang xây dựng một ứng dụng Python yêu cầu xác thực, hãy xem xét sử dụng Auth0 vì nó chắc chắn sẽ giúp bạn tiết kiệm nhiều thời gian và công sức. Sau khi đăng ký, việc thiết lập ứng dụng của bạn với AUTH0 khá đơn giản. Nếu bạn cần trợ giúp, bạn có thể xem qua tài liệu hoặc đăng câu hỏi của bạn trong phần bình luận bên dưới.

Làm cách nào để thay đổi kích thước một hình ảnh trong mã?

Một trong những cách đơn giản nhất để thay đổi kích thước hình ảnh trong HTML là sử dụng các thuộc tính chiều cao và chiều rộng trên thẻ IMG. Các giá trị này chỉ định chiều cao và chiều rộng của phần tử hình ảnh. Các giá trị được đặt trong pxel CSS.using the height and width attributes on the img tag. These values specify the height and width of the image element. The values are set in px i.e. CSS pixels.

Làm cách nào để thay đổi kích thước hình ảnh CV2 trong Python?

Kích thước mới có thể được chỉ định:..
Bằng tay; chiều cao, chiều rộng = src.Shape [: 2] dst = cv2.resize (src, (2*chiều rộng, 2*chiều cao), nội suy = cv2.inter_cubic).
Bởi một yếu tố tỷ lệ. DST = CV2. Thay đổi kích thước (src, none, fx = 2, fy = 2, nội suy = cv2 ..

Làm thế nào để tôi thay đổi kích thước một hình ảnh trong một danh sách trong Python?

Bạn có thể thay đổi kích thước nhiều hình ảnh trong Python với thư viện PIL tuyệt vời và một trợ giúp nhỏ của thư viện HĐH (hệ điều hành).Bằng cách sử dụng hàm Os.ListDir (), bạn có thể đọc tất cả các tên tệp trong một thư mục. Sau đó, tất cả những gì bạn phải làm là tạo một vòng lặp để mở, thay đổi kích thước và lưu mỗi hình ảnh trong thư mục.By using os. listdir() function you can read all the file names in a directory. After that, all you have to do is to create a for loop to open, resize and save each image in the directory.

Làm cách nào để có được kích thước của một hình ảnh trong Python?

Open () được sử dụng để mở hình ảnh và sau đó là thuộc tính của hình ảnh được sử dụng để có được chiều cao và chiều rộng của hình ảnh. width and . height property of Image are used to get the height and width of the image.

Làm cách nào để giảm kích thước của một JPEG trong Python?

GetSize (Image_Name) # In kích thước trước khi nén/thay đổi kích thước in ("[*] Kích thước trước khi nén:"Để giảm kích thước hình ảnh img = img.resize ((int (img.size [0] * new_size_ratio), int (img.img = img. resize((int(img. size[0] * new_size_ratio), int(img.