Tìm đường đến Exif

Vị trí, máy ảnh, ống kính, ISO… Nhận tất cả!
Một bức tranh nói lên hàng nghìn từ, chắc chắn. Tuy nhiên, đôi khi khán giả muốn nhiều hơn thế. Họ muốn biết bạn ở đâu khi bạn chụp ảnh, bạn sử dụng máy ảnh nào, ống kính nào, ISO gì… Chi tiết, trẻ con, người hâm mộ muốn chi tiết!

Tuy nhiên, khách truy cập bình thường của bạn sẽ không đặc biệt quan tâm đến những chi tiết này. Tuy nhiên, sẽ có một lớp khách quan tâm đến những gì diễn ra sau tấm rèm cửa; các đai ốc và bu lông; các chi tiết kỹ thuật tuyệt vời. Lớp khách này sẽ muốn biết đường đi nước bước, nhiều hơn là có thể truy cập ngay lập tức.

Giả sử bạn là một nhiếp ảnh gia và đối với mỗi bài đăng của bạn, điều này - chúng tôi sẽ gọi chúng là những người tò mò chuyên nghiệp - nhóm khách truy cập thích biết những gì được thiết lập. Đặc biệt, họ rất thích nhìn dữ liệu Exif được hiển thị ngay cùng với các bức ảnh.

Để tránh làm lộn xộn các bài đăng, chúng tôi sẽ triển khai điều này trong trang đính kèm.

Trước khi chúng ta tiếp tục, tôi sẽ cho rằng bạn biết rằng mỗi bức ảnh bạn chụp, trên bất kỳ máy ảnh nào, vào bất kỳ lúc nào đều có thể có siêu dữ liệu được đính kèm với nó. Siêu dữ liệu này sẽ có thông tin chi tiết cụ thể về khi nào, ở đâu và cách thức liên quan đến bức ảnh cụ thể. tức là ở mức tối thiểu, nó sẽ có thông tin về thời điểm chụp ảnh, máy ảnh nào được sử dụng, ống kính nào và cài đặt trên máy ảnh là gì. Không thay đổi, cuối cùng khi được tải lên một trang web hỗ trợ WordPress, hình ảnh này sẽ giữ nguyên siêu dữ liệu mà, với tư cách là một nhà thiết kế chủ đề, bạn có thể khai thác và sử dụng.

Đương nhiên, trước tiên cần xác định một hàm thực hiện điều này.

Xác định chức năng

WordPress đã có một built-in chức năng cho việc này. Vì vậy, trái ngược với việc xác định một từ đầu, chúng tôi sẽ sử dụng điều đó.wp_get_attachment_metadata()

Đầu tiên, nếu bạn chưa có, hãy tạo và mở tệp mẫu. Đây là mẫu mà WordPress sẽ sử dụng để hiển thị các tệp đính kèm duy nhất là hình ảnh.image.php

Ở đầu tệp, chúng tôi sẽ truy xuất các trường meta của hình ảnh hiện tại và lưu trữ chúng trong một biến $metadata mà sau đó chúng tôi sẽ sử dụng để hiển thị thông tin của mình. Như vậy:

<?php
  // Retrieve attachment metadata.
  $metadata = wp_get_attachment_metadata();

  get_header();
?>

Các $metadata biến hiện đang lưu trữ các giá trị lấy ra bởi các chức năng. Các giá trị này (tức là các trường meta của tệp đính kèm cụ thể) là:wp_get_attachment_metadata()

  • width: chiều rộng của tệp đính kèm.
  • height: chiều cao của tệp đính kèm
  • file: đường dẫn đến tệp đính kèm liên quan đến thư mục tải lên
  • size: đây là một mảng kích thước. tức là, các phiên bản khác nhau của hình ảnh mà WordPress tạo ra. Chìa khóa của mảng này là một chuỗi các tệp đính kèm với nhiều kích cỡ khác nhau. ví dụ: 'thumbnail', 'medium', 'large', v.v. Ví dụ: giả sử chúng ta đang làm việc với phiên bản 'lớn', giá trị của các khóa này là một mảng chứa các giá trị sau:
    • tệp: đường dẫn đến phiên bản 'lớn' của tệp đính kèm liên quan đến thư mục tải lên
    • width: chiều rộng của phiên bản 'lớn' của tệp đính kèm
    • height: chiều cao của phiên bản 'lớn' của tệp đính kèm
    • mime-type: loại hình ảnh, ví dụ image / jpeg hoặc image / png
  • image_meta: Đây là một mảng trả về một tập hợp các thông tin Exif và IPTC như:
    • camera: kiểu máy ảnh được sử dụng
    • aperture: kích thước của ap
    • focal_length: số f hoặc f-stop của ống kính
    • shutter_speed
    • iso
    • title:
    • credit: nếu có, điều này sẽ hiển thị nghệ sĩ / tác giả của các trường hình ảnh
    • caption: nếu có, hiển thị trường đầu tiên của trường mô tả người dùng / hình ảnh
    • created_timestamp: ngày chụp ảnh
    • copyright

Sử dụng chức năng

Với thông tin meta ở trên đã được lưu trữ bên trong $metadata biến, bây giờ chúng ta có thể hiển thị nó trên trang.

Để hiển thị thông tin trong danh sách định nghĩa, trong vòng lặp, hãy bao gồm mã sau:

<dl>
  <dt>Dimensions:</dt>
  <dd><?php echo $metadata['width']; ?> × <?php echo $metadata['height']; ?></dd>

  <dt>Camera:</dt>
  <dd><?php echo $metadata['image_meta']['camera']; ?></dd>

  <dt>Aperture:</dt>
  <dd><?php echo $metadata['image_meta']['aperture']; ?></dd>

  <dt>Focal length:</dt>
  <dd><?php echo $metadata['image_meta']['focal_length']; ?></dd>

  <dt>Shutter speed:</dt>
  <dd><?php echo $metadata['image_meta']['shutter_speed']; ?></dd>

  <dt>ISO:</dt>
  <dd><?php echo $metadata['image_meta']['iso']; ?></dd>

  <dt>Title:</dt>
  <dd><?php echo $metadata['image_meta']['title']; ?></dd>

  <dt>Credit:</dt>
  <dd><?php echo $metadata['image_meta']['credit']; ?></dd>

  <dt>Caption:</dt>
  <dd><?php echo $metadata['image_meta']['caption']; ?></dd>

  <dt>Created timestamp:</dt>
  <dd><?php echo $metadata['image_meta']['created_timestamp']; ?></dd>
</dl>

Với điều đó, trên trang đính kèm hình ảnh cụ thể trong trình duyệt, bạn sẽ thấy một đầu ra tương tự như sau:

Dimensions:         2448 × 2448
Camera:             iPhone 5s
Aperture:           2.2
Focal length:       4.12
Shutter speed:      0.0333333333333
ISO:                64
Title:
Credit:
Caption:
Created timestamp:  1398010637

Khởi đầu tuyệt vời nhưng bạn sẽ nhận thấy một vài giá trị trống. Ngoài ra, tốc độ cửa trập và dấu thời gian cũng có thể sử dụng một số yêu cầu.

Để tránh các trường trống, hãy bọc kết quả trong câu lệnh if / else tiêu chuẩn để đảm bảo chỉ các trường có giá trị được hiển thị. Ví dụ: để chỉ hiển thị trường ‘tiêu đề’ nếu trường không trống, hãy thay thế lệnh gọi đã xác định trước đó bằng lệnh này:

<?php echo empty($metadata['image_meta']['title']) ? "" : '<dt>Title</dt> <dd>'  . $metadata['image_meta']['title'] . '</dd>'; ?>

Nếu bạn không quen thuộc với những điều trên, thì đó là ký hiệu viết tắt PHP. Thay thế rất tiện dụng cho các câu lệnh if / else chi tiết về lớp phủ. Nếu bạn thấy phần trên hơi mất tập trung và không rõ ràng trong mã của mình, bạn có thể sử dụng câu lệnh if / else tiêu chuẩn hơn như sau:

<?php if ( ! empty($metadata['image_meta']['title']) ) { ?>
  <dt>Title:</dt>
  <dd><?php echo $metadata['image_meta']['title']; ?></dd>
<?php } ?>

Điều tương tự.

Tùy thuộc vào cách bạn muốn hiển thị dấu thời gian, hãy sử dụng các định dạng ngày PHP tiêu chuẩn. ví dụ

<?php echo date('M jS, Y', $metadata['image_meta']['created_timestamp']); ?>

sẽ mang lại:

Apr 20th, 2014

Đánh lừa tốc độ màn trập

Tốc độ màn trập thường được hiển thị dưới dạng phân số. Hiện nay chúng tôi có một số thập phân chứ không phải khó coi: 0.0333333333333. Để có ý nghĩa đối với người xem, con số này nên được hiển thị dưới dạng .1/30

Để đạt được điều này, chúng ta cần xác định một hàm nhận số thập phân của chúng ta (bất kỳ điều gì xảy ra) và trả lại cho chúng ta một phân số được định dạng đúng.

Trong nghiên cứu của mình để tìm ra cách tiếp cận tốt nhất để xử lý tốc độ cửa trập, tôi đã tìm thấy rất nhiều kết quả, mặc dù là cũ. Tuy nhiên, cách tiếp cận tốt nhất mà tôi tìm thấy không phải trong một bài báo thực tế mà là một nhận xét dường như có thể bỏ qua trên một bài báo. Đó là giải pháp mà chúng tôi sẽ triển khai.

Chúng ta cần xác định một chức năng sẽ chuyển đổi tốc độ cửa trập ở dạng thập phân thành một phân số, lưu ý rằng đôi khi tốc độ cửa trập ở dạng thập phân không phải lúc nào cũng xuất ra một số nguyên / sạch.

Để làm như vậy, chúng tôi xác định hàm sau bên trong :functions.php

function butter_convert_decimal_to_fraction ($number) {
  
  list ($whole, $numerator) = explode ('.', $number);
  
  $denominator = 1 . str_repeat (0, strlen ($numerator));
  
  $butter_greatest_common_divisor = butter_greatest_common_divisor ($numerator, $denominator);
  
  $numerator /= $butter_greatest_common_divisor;
  
  $denominator /= $butter_greatest_common_divisor;
  
  if($whole == 0)
    
    return sprintf ('1/%d', round($denominator/$numerator));
  
  return sprintf ('%d 1/%d', $whole, round($denominator/$numerator));
}

function butter_greatest_common_denominator ($a, $b) {
  while ( $b != 0) {
    $remainder = $a % $b;
    $a = $b;
    $b = $remainder;
  }
  return abs ($a);
}

Với chức năng tại chỗ, hãy quay lại tệp. Nơi bạn có cuộc gọi đến:image.php

<?php echo $metadata['image_meta']['shutter_speed']; ?>

Thay thế bằng:

<?php printf("%s\n", butter_convert_decimal_to_fraction($metadata['image_meta']['shutter_speed'])); ?>

Bây giờ sẽ ra tốc độ này bạn chụp ở định dạng phù hợp: .1/30