Hướng dẫn dùng image pixel trong PHP

Bạn có thể viết tập lệnh tạo và trả về hình ảnh .gif, .jpeg hoặc .png bằng cách sử dụng PHP cho mục đích theo dõi bằng thư viện Gd [thường được phân phối với PHP trong các phiên bản hiện đại]. Nếu bạn không có quyền truy cập vào Gd, bạn luôn có thể biên dịch lại PHP khi được bật.

Thí dụ:

pixel.php [nhận xét cho mục đích giải thích]:


Trong một ví dụ đơn giản, sau đó bạn có thể gọi pixel theo dõi này bằng URL ví dụ sau trong email hoặc trang khác:


Sử dụng biến:

Trong pixel.php của bạn, sau đó bạn có thể phân tích và giải thích bất kỳ biến $_GET nào được truyền cho nó trong thẻ hình ảnh, một cách đơn giản:

if [isset[$_GET['a']]] {
  // [Do|log] act on a
}
if [isset[$_GET['b']]] {
  // [Do|log] act on b
}
if [isset[$_GET['c']]] {
  // [Do|log] act on c
}

Áp dụng và lặp lại khi bạn cần, nhưng bạn có thể khá tinh vi về những gì bạn làm và đặc biệt là khi bạn có quyền truy cập vào khá nhiều thông tin về người dùng thông qua việc có thể đặt vars trên chuỗi $_GET.

Một ví dụ phù hợp hơn có thể là:


Theo dõi nhiều hơn chỉ các biến $ _GET:

Bạn cũng có thể lấy thêm nhiều thông tin bằng PHP, chẳng hạn như:

// Server variables
$ip = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$browser = get_browser[null, true];
etc...

và sau đó có thể chèn vào bảng theo dõi trong cơ sở dữ liệu của bạn: 

$sql = "INSERT INTO campaign_tracking 
        ['when','campaign','last','ip','useragent'] 
        VALUES 
        [NOW[],'$campaign','$last','$ip','$useragent']";

Đây là phương thức cơ bản a[the] được sử dụng rộng rãi để theo dõi các chiến dịch tiếp thị email và cụ thể là trong PHP, nhưng phương pháp tương tự được áp dụng bằng các ngôn ngữ và thư viện lập trình/kịch bản khác - và cho các mục đích khác.

Thông tin thêm và hữu ích về Gd:

  • Tham khảo GV - trên php.net

Từ câu hỏi của bạn, có vẻ như bạn là người mới đối với GD, tôi sẽ chia sẻ một số kinh nghiệm của tôi, có thể đây là một chủ đề hơi xa vời, nhưng tôi nghĩ nó sẽ hữu ích cho người mới làm quen với GD như bạn:

Bước 1, xác nhận tập tin. Sử dụng chức năng sau để kiểm tra xem $_FILES['image']['tmp_name']tệp có phải là tệp hợp lệ không:

   function getContentsFromImage[$image] {
      if [@is_file[$image] == true] {
         return file_get_contents[$image];
      } else {
         throw new \Exception['Invalid image'];
      }
   }
   $contents = getContentsFromImage[$_FILES['image']['tmp_name']];

Bước 2, lấy định dạng tệp Hãy thử chức năng sau với phần mở rộng finfo để kiểm tra định dạng tệp của tệp [nội dung]. Bạn sẽ nói tại sao bạn không sử dụng $_FILES["image"]["type"]để kiểm tra định dạng tệp? Bởi vì nó CHỈ kiểm tra phần mở rộng tệp không phải nội dung tệp, nếu ai đó đổi tên tệp ban đầu được gọi là world.png thành world.jpg , $_FILES["image"]["type"]sẽ trả về jpeg không png, do đó $_FILES["image"]["type"]có thể trả về kết quả sai.

   function getFormatFromContents[$contents] {
      $finfo = new \finfo[];
      $mimetype = $finfo->buffer[$contents, FILEINFO_MIME_TYPE];
      switch [$mimetype] {
         case 'image/jpeg':
            return 'jpeg';
            break;
         case 'image/png':
            return 'png';
            break;
         case 'image/gif':
            return 'gif';
            break;
         default:
            throw new \Exception['Unknown or unsupported image format'];
      }
   }
   $format = getFormatFromContents[$contents];

Bước.3, Nhận tài nguyên GD Nhận tài nguyên GD từ nội dung chúng tôi có trước đây:

   function getGDResourceFromContents[$contents] {
      $resource = @imagecreatefromstring[$contents];
      if [$resource == false] {
         throw new \Exception['Cannot process image'];
      }
      return $resource;
   }
   $resource = getGDResourceFromContents[$contents];

Bước 4, lấy kích thước hình ảnh Bây giờ bạn có thể lấy kích thước hình ảnh với mã đơn giản sau:

  $width = imagesx[$resource];
  $height = imagesy[$resource];

Bây giờ, chúng ta hãy xem biến chúng ta đã nhận được từ hình ảnh gốc sau đó:

       $contents, $format, $resource, $width, $height
       OK, lets move on

Bước 5, tính toán các đối số hình ảnh đã thay đổi kích thước Bước này liên quan đến câu hỏi của bạn, mục đích của chức năng sau là để thay đổi kích thước đối số cho chức năng GD imagecopyresampled[], mã này khá dài, nhưng nó hoạt động rất tốt, thậm chí có ba tùy chọn: kéo dài, thu nhỏ và điền vào.

căng : kích thước của hình ảnh đầu ra giống với kích thước mới bạn đặt. Không giữ tỷ lệ chiều cao / chiều rộng.

thu nhỏ : kích thước của hình ảnh đầu ra sẽ không vượt quá kích thước mới mà bạn cung cấp và giữ tỷ lệ chiều cao / chiều rộng của hình ảnh.

fill : kích thước của hình ảnh đầu ra sẽ giống với kích thước mới mà bạn cung cấp, nó sẽ cắt và thay đổi kích thước hình ảnh nếu cần và giữ tỷ lệ chiều cao / chiều rộng của hình ảnh. Tùy chọn này là những gì bạn cần trong câu hỏi của bạn.

   function getResizeArgs[$width, $height, $newwidth, $newheight, $option] {
      if [$option === 'stretch'] {
         if [$width === $newwidth && $height === $newheight] {
            return false;
         }
         $dst_w = $newwidth;
         $dst_h = $newheight;
         $src_w = $width;
         $src_h = $height;
         $src_x = 0;
         $src_y = 0;
      } else if [$option === 'shrink'] {
         if [$width = $newwidth / $newheight] {
            $src_w = [int] round[[$newwidth * $height] / $newheight];
            $src_h = $height;
            $src_x = [int] round[[$width - $src_w] / 2];
            $src_y = 0;
         } else {
            $src_w = $width;
            $src_h = [int] round[[$width * $newheight] / $newwidth];
            $src_x = 0;
            $src_y = [int] round[[$height - $src_h] / 2];
         }
         $dst_w = $newwidth;
         $dst_h = $newheight;
      }
      if [$src_w  0,
          'src_x' => $src_x,
          'src_y' => $src_y,
          'dst_w' => $dst_w,
          'dst_h' => $dst_h,
          'src_w' => $src_w,
          'src_h' => $src_h
      ];
   }
   $args = getResizeArgs[$width, $height, 150, 170, 'fill'];

Bước 6, thay đổi kích thước hình ảnh sử dụng $args, $width, $height, $formatvà tài nguyên $ chúng tôi nhận được từ trên vào các chức năng sau đây và nhận được tài nguyên mới của hình ảnh thay đổi kích cỡ:

   function runResize[$width, $height, $format, $resource, $args] {
      if [$args === false] {
         return; //if $args equal to false, this means no resize occurs;
      }
      $newimage = imagecreatetruecolor[$args['dst_w'], $args['dst_h']];
      if [$format === 'png'] {
         imagealphablending[$newimage, false];
         imagesavealpha[$newimage, true];
         $transparentindex = imagecolorallocatealpha[$newimage, 255, 255, 255, 127];
         imagefill[$newimage, 0, 0, $transparentindex];
      } else if [$format === 'gif'] {
         $transparentindex = imagecolorallocatealpha[$newimage, 255, 255, 255, 127];
         imagefill[$newimage, 0, 0, $transparentindex];
         imagecolortransparent[$newimage, $transparentindex];
      }
      imagecopyresampled[$newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']];
      imagedestroy[$resource];
      return $newimage;
   }
   $newresource = runResize[$width, $height, $format, $resource, $args];

Bước 7, nhận nội dung mới , Sử dụng chức năng sau để nhận nội dung từ tài nguyên GD mới:

   function getContentsFromGDResource[$resource, $format] {
      ob_start[];
      switch [$format] {
         case 'gif':
            imagegif[$resource];
            break;
         case 'jpeg':
            imagejpeg[$resource, NULL, 100];
            break;
         case 'png':
            imagepng[$resource, NULL, 9];
      }
      $contents = ob_get_contents[];
      ob_end_clean[];
      return $contents;
   }
   $newcontents = getContentsFromGDResource[$newresource, $format];

Bước 8 nhận tiện ích mở rộng , Sử dụng chức năng sau để nhận tiện ích mở rộng từ định dạng hình ảnh [lưu ý, định dạng hình ảnh không bằng tiện ích mở rộng hình ảnh]:

   function getExtensionFromFormat[$format] {
      switch [$format] {
         case 'gif':
            return 'gif';
            break;
         case 'jpeg':
            return 'jpg';
            break;
         case 'png':
            return 'png';
      }
   }
   $extension = getExtensionFromFormat[$format];

Bước 9 lưu hình ảnh Nếu chúng ta có một người dùng có tên mike, bạn có thể thực hiện các thao tác sau, nó sẽ lưu vào cùng thư mục với tập lệnh php này:

$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents[$filename, $newcontents];

Bước 10 hủy tài nguyên Đừng quên hủy tài nguyên GD!

imagedestroy[$newresource];

hoặc bạn có thể viết tất cả mã của mình vào một lớp và chỉ cần sử dụng như sau:

   public function __destruct[] {
      @imagedestroy[$this->resource];
   }

LỜI KHUYÊN

Tôi khuyên bạn không nên chuyển đổi định dạng tệp mà người dùng tải lên, bạn sẽ gặp nhiều vấn đề.

9 hữu ích 0 bình luận chia sẻ

Chủ Đề