Cách khắc phục sự cố xoay hình ảnh trong php

Vấn đề thường được báo cáo bởi người dùng iPhone và iPad. Bạn nhấp vào một bức ảnh và tải nó lên và mong đợi nó hiển thị ngay như minh họa bên dưới

Những gì bạn mong đợi, Điều gì xảy ra thay vào đó là điều này

Những gì bạn nhận được, thay vào đó

Điều có thể đoán được từ các hình ảnh là những điện thoại thông minh này không sửa lỗi xoay trong dữ liệu EXIF ​​​​của hình ảnh. Ứng dụng gốc của điện thoại đọc dữ liệu EXIF ​​và hiển thị chính xác. Tuy nhiên, khi tải lên WordPress, quá trình đọc này không được thực hiện và do đó hình ảnh bị xoay

Giải pháp lý tưởng

Lý tưởng nhất là ứng dụng hiển thị hình ảnh nên đọc hướng của hình ảnh và xoay nó theo yêu cầu trên màn hình. Trong trường hợp của chúng tôi, các trình duyệt nên biết rằng hình ảnh được xoay và sửa lỗi hiển thị. Thật không may, ngoài cái mới nhất [ngạc nhiên. ] Internet Explorer, không có trình duyệt nào được biết là thực hiện điều này

Cách chúng tôi khắc phục sự cố trong PHP

Một cách khác để giải quyết vấn đề này là đọc dữ liệu EXIF ​​​​và sửa lỗi xoay. Với BuddyPress Media, chúng tôi đã làm được điều này

Bạn đã tạo một trình tải lên ảnh mới lạ mắt vào ứng dụng của mình và trong vòng chưa đầy 10 phút sau khi đưa nó vào sản xuất, ai đó đã tải lên một loạt ảnh và chúng nằm nghiêng, lộn ngược hoặc thậm chí tệ hơn. ngược. Chào mừng bạn đến với internet nơi điện thoại có thể tải trực tiếp từ thư viện ảnh của họ. Không sao đâu, chúng ta có thể sửa lỗi này

Sửa Xoay ẢnhN

$Image = new Imagick[$Filename];
$Orientation = $Image->GetImageOrientation[];

Đây là cách chúng tôi hỏi về hướng của hình ảnh. Giá trị mà nó trả về khớp với một loạt Imagick. Định hướng_ hằng số cho bạn biết những thứ như Trên cùng bên trái, Trên cùng bên phải, Dưới cùng bên phải, Dưới cùng bên trái. vân vân. Điều mà hệ thống Top Left Right Bottom này đang cố nói với chúng ta là cách đọc nó. Bất kể bạn nghĩ cách xoay ảnh có thể là gì, chúng được đọc giống như một cuốn sách [bằng các ngôn ngữ như tiếng Anh] từ góc trên cùng bên trái, sang phải, sau đó xuống dòng tiếp theo bên trái khi nhấn vào cạnh. Từ đầu tiên cho chúng ta biết trục X được căn chỉnh theo cạnh nào và từ thứ hai cho chúng ta biết trục Y được căn chỉnh theo cạnh nào. Trong ngữ cảnh này, chúng tôi muốn nói "đọc hình ảnh" là hiểu vị trí [0,0] pixel "thực sự" nằm ở đâu, mặc dù nó có thể không "thực sự" nằm ở đó.

Trên cùng bên trái, Imagick. ORIENTATION_TOPLEFT, là "Bình thường" và không cần chỉnh sửa hình ảnh. Nếu chúng ta có một hình ảnh nói rằng nó được định hướng Right Top, Imagick. ORIENTATION_RIGHTTOP chúng ta cần -giả vờ- rằng nếu chúng ta đang đọc hình ảnh này thì Góc trên cùng bên phải sẽ được xử lý như thể nó thực sự là Góc trên cùng bên trái. làm sao chúng ta làm việc đó bây giờ?

Quay đầu 90 độ theo chiều kim đồng hồ. Góc trên cùng bên phải trở thành góc trên cùng bên trái và văn bản dễ đọc hơn. Bây giờ để sửa đầu của bạn, bạn cần xoay nó 90 độ ngược chiều kim đồng hồ và đó là giá trị được sử dụng để sửa ảnh

$Image = new Imagick[$Filename];
$Orientation = $Image->GetImageOrientation[];

if[$Orientation === Imagick::ORIENTATION_RIGHTTOP] {
	$Image->RotateImage['#000000',-90];
}

Dưới cùng bên phải có nghĩa là bạn phải quay ngược đầu 180 độ để đọc [-180 để sửa] và Dưới cùng bên trái, hết khoảng 270 độ [hoặc 90 độ ngược chiều kim đồng hồ] để đọc [-270 hoặc 90 để sửa]

Sửa ảnh bị lật

Tất cả những điều đó đã cho chúng tôi biết cách hiểu những hình ảnh chỉ được xoay nhưng còn một vấn đề nữa, đó là camera selfie chết tiệt. Ngoài khả năng xoay hình ảnh, camera selfie nhìn bạn như một tấm gương nhưng sau đó lưu ảnh với ghi chú rằng bạn cần lật ảnh - hình ảnh cuối cùng sẽ được xem như cách ai đó đang xem và cười khi bạn chụp ảnh tự sướng nhìn thấy bạn

Khi một hình ảnh được gắn cờ Trên cùng bên phải, đây là đầu mối cho bức ảnh này bị ngược. Trục X được căn chỉnh với cạnh trên cùng giống như Trên cùng bên trái, nhưng trục Y hiện nằm ở cạnh phải. Nếu không chỉnh sửa, chúng tôi có thể sẽ thấy trong ứng dụng của mình phiên bản bên trái ở trên, khi mục tiêu là xem phiên bản bên phải

$Image = new Imagick[$Filename];
$Orientation = $Image->GetImageOrientation[];

if[$Orientation === Imagick::ORIENTATION_TOPRIGHT] {
	$Image->FlopImage[];
}

Đáy phải có nghĩa là bạn sẽ cần quay đầu lại 90 độ theo chiều kim đồng hồ và vẫn sử dụng gương. Phía dưới bên trái lộn ngược và có gương. Trên cùng bên trái sau đó -90deg và có gương

Đặt nó lại với nhau

Để sửa tất cả những bức ảnh này, chúng [có thể] cần một phép quay. Sau khi xoay, chúng [có thể] cần phải được lật. Đây là mã cuối cùng để đọc một hình ảnh và quyết định quá trình sửa hướng của nó để xuất hiện chính xác. Lưu ý rằng các giá trị này mong muốn mã của tôi xoay ảnh trước khi lật nó, không có lý do thực sự chính đáng, đó chỉ là những gì tôi đã làm

Chủ Đề