คอมพิวเตอร์ หน้าต่าง อินเทอร์เน็ต

ลายน้ำ.php. การเพิ่มลายน้ำแบบไดนามิกให้กับรูปภาพโดยใช้ PHP การเลือกวิธีการใส่ลายน้ำ

คุณมีความเสี่ยงสูงเมื่อคุณเผยแพร่รูปภาพและวิดีโอของคุณบนอินเทอร์เน็ต เนื่องจากเนื้อหาของคุณอาจถูกคัดลอกไปยังไซต์อื่นๆ หลายร้อยไซต์ได้อย่างง่ายดาย การค้นหารูปภาพของคุณสำหรับข่าว เช่น ที่คุณทำงานหนักในเว็บไซต์อื่นโดยไม่ระบุแหล่งที่มานั้นคงไม่ดีนัก ซึ่งก็คือเว็บไซต์ของคุณใช่ไหม คุณจะอารมณ์เสีย พูดเบา ๆ และถ้ามันไม่ใช่ภาพธรรมดาสำหรับข่าว แต่เป็นการทำงานที่ซับซ้อนใน Photoshop การบอกว่าคุณโกรธก็คือไม่ต้องพูดอะไรเลย! คุณจะทำอย่างไรเพื่อปกป้องกราฟิกของคุณ

เพื่อปกป้องลิขสิทธิ์ของรูปภาพหรือวิดีโอบนอินเทอร์เน็ต มักใช้ลายน้ำดิจิทัลหรือลายน้ำดิจิทัลเพื่อความสะดวก แนบลายน้ำกับภาพที่อัปโหลดแต่ละภาพเพื่อรักษาความปลอดภัย CEH สามารถเป็นโลโก้ของไซต์หรือบริษัทของคุณ วางไว้อย่างสวยงามและสวยงามบนรูปภาพที่อัปโหลด

ก่อนอื่นมาสร้างไฟล์ที่มีการตั้งค่าที่จำเป็นในรูปแบบของค่าคงที่ - /config.php:

กำหนด ("WATERMARK_OVERLAY_IMAGE", "/develop/images/watermark.png"); // กำหนดเส้นทางไปยังลายน้ำของคุณ ("WATERMARK_OUTPUT_QUALITY", 100); // คุณภาพของภาพที่ได้รับจากลายน้ำ โปรดจำไว้ว่าคุณภาพมีผลโดยตรงต่อขนาดไฟล์ กำหนด ("UPLOADED_IMAGE_DESTINATION", "/develop/folder1/"); // พาธไปยังตำแหน่งของภาพที่โหลดเริ่มต้น กำหนด ("WATERMARK_IMAGE_DESTINATION", "/develop/folder2/"); // พาธไปยังภาพที่มีลายน้ำซ้อนทับ

มารวบรวมไฟล์ที่สร้างขึ้นด้านบนในไฟล์ที่ดำเนินการดาวน์โหลด /upload.php

รวม ("config.php"); รวม ("functions.php"); $result = ImageUpload($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"]); ถ้า ($result === false)( echo "อัพโหลดล้มเหลว!"; )

ตัวอย่างเช่น หากรูปภาพที่กำลังโหลดคือ:

หลังจากโหลดและใส่ลายน้ำแล้ว คุณจะได้ภาพต่อไปนี้:

ในตัวอย่างนี้ รูปภาพที่อัปโหลดจะถูกบันทึกไว้ในโฟลเดอร์หนึ่ง และรูปภาพที่มีลายน้ำดิจิทัลอยู่ในอีกโฟลเดอร์หนึ่ง เพื่อให้คุณสามารถเข้าถึงรูปภาพต้นฉบับได้ตลอดเวลา แต่แน่นอน คุณควรวางรูปภาพจาก CEH ไว้ในไซต์

(178.4 KiB, 989 ครั้ง)

มีรูปภาพจำนวนมากบนอินเทอร์เน็ตซึ่งตามกฎแล้วเจ้าของไซต์หรือผู้ใช้ไซต์อัปโหลด รูปภาพอาจย้ายจากไซต์หนึ่งไปยังอีกไซต์หนึ่ง ทั้งนี้ขึ้นอยู่กับความเกี่ยวข้อง ไม่ต้องพูดถึงลิขสิทธิ์ เจ้าของไซต์บางรายอาจไม่ชอบความจริงที่ว่ารูปภาพจากไซต์ของตนถูกคัดลอกไปยังแหล่งข้อมูลอื่น เพื่อเป็นการต่อสู้กับการคัดลอกภาพซ้ำ ๆ ของเว็บไซต์ มันถูกประดิษฐ์ขึ้นเพื่อกำหนดลายน้ำบนภาพ เพื่อระบุว่าภาพนั้นเป็นของทรัพยากรเฉพาะ โดยเฉพาะอย่างยิ่งสำหรับไซต์ที่มีภาพที่ไม่ซ้ำกันจำนวนมาก

มาดูตัวอย่างโค้ดที่แสดงการวางลายน้ำบนรูปภาพที่อัปโหลด

ดังนั้น การตั้งค่าหลักจะอยู่ในรูปของค่าคงที่ และค่าเหล่านั้นจะเป็นค่าแรกในโค้ด:

// กำหนดเส้นทางภาพลายน้ำ ("WATERMARK_OVERLAY_IMAGE", "/lab/watermark/watermark.png"); // การบีบอัด ช่วง 0-100 (ส่งผลต่อคุณภาพของภาพ) กำหนด ("WATERMARK_OUTPUT_QUALITY", 100); // กำหนดโฟลเดอร์รูปภาพต้นฉบับ ("UPLOADED_IMAGE_DESTINATION", "/lab/watermark/upload/src/"); // กำหนดโฟลเดอร์ที่มีภาพที่ประมวลผลแล้ว ("WATERMARK_IMAGE_DESTINATION", "/lab/watermark/upload/");

ทางเพจเราจะวางแบบฟอร์มอัพโหลดภาพที่จะใช้ส่งภาพไปยังเซิร์ฟเวอร์
รหัสแบบฟอร์ม:

เลือกไฟล์ภาพ:
ภาพต้นฉบับ
"style="max-width: 300px;" />
ภาพที่มีลายน้ำ
"style="max-width: 300px;" />

ตอนนี้สิ่งที่สำคัญที่สุดคือฟังก์ชั่นสำหรับการประมวลผลภาพ วางฟังก์ชันเหล่านี้ก่อนแสดงแบบฟอร์มบนเพจ

ฟังก์ชันหลักสองฟังก์ชัน ฟังก์ชันหนึ่งอัปโหลดรูปภาพไปยังเซิร์ฟเวอร์ โดยใช้ฟังก์ชันหลักอีกฟังก์ชันหนึ่งทับลายน้ำ บางทีความคิดเห็นเกี่ยวกับฟังก์ชันต่างๆ อาจอธิบายไว้มากกว่ารายละเอียด และอาจไม่จำเป็นที่จะเขียนเหมือนกันที่นี่

หากคุณต้องการเพิ่มลายน้ำให้กับรูปภาพโดยไม่ต้องใช้โปรแกรมแก้ไขรูปภาพหรือเพิ่มในขณะที่อัปโหลดรูปภาพไปยังเซิร์ฟเวอร์ บทเรียนนี้เหมาะสำหรับคุณ

ในบทช่วยสอนนี้ ฉันจะแสดงวิธีเพิ่มลายน้ำให้กับรูปภาพโดยไม่ต้องเปลี่ยนรูปภาพต้นฉบับ ก่อนอื่น คุณต้องมีรูปภาพที่จะใช้เป็นลายน้ำ

จากนั้นเราสร้างส่วนหัวของไฟล์:

// บรรทัดนี้จะบอกเบราว์เซอร์ว่าเรากำลังส่ง jpg image header("content-type: image/jpeg");

จากนั้นเราสร้างภาพ png และรับขนาด:

// สร้างลายน้ำ png $watermark = imagecreatefrompng("watermark.png"); // รับความกว้างและความสูง $watermark_width = imagesx($watermark); $watermark_height = imagesy($ลายน้ำ);

เราจะทำเช่นเดียวกันกับภาพต้นฉบับ แต่เฉพาะในรูปแบบ jpg นี่เป็นเรื่องปกติสำหรับรูปภาพที่อัปโหลดผ่านแบบฟอร์ม เราดำเนินการดังนี้:

// สร้างภาพ jpg $image_path = "original.jpg"; $image = imagecreatefromjpeg($image_path); // รับขนาดภาพ $size = getimagesize($image_path);

ตอนนี้เราต้องวางลายน้ำบนภาพ:

// ใส่ลายน้ำที่ด้านล่างขวา ช่องว่างภายใน 5px $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5;

จากนั้นเราจะตั้งค่าตัวเลือกการผสมสำหรับทั้งสองภาพ:

imagealphablending($image, จริง); imagealphablending($ลายน้ำ, จริง);

ในตอนท้าย เราสร้างภาพใหม่โดยใช้พารามิเตอร์:

// สร้างสำเนารูปภาพใหม่ ($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($ภาพ);

สิ่งสำคัญคือต้องออกไป:

// หน่วยความจำฟรี imagedestroy($image); ภาพทำลาย ($ ลายน้ำ);

คุณสามารถใช้ Photoshop เพื่อปรับความโปร่งใสของลายน้ำ

นั่นคือทั้งหมดที่เกี่ยวกับทฤษฎี ตอนนี้เราจะใช้ความรู้ของเราในโครงการจริง ทั้งหมดนี้จะต้องบันทึกลงในไฟล์ ตัวอย่างเช่น ชื่อ watermark.php

ส่วนหัว ("ประเภทเนื้อหา: รูปภาพ / jpeg"); // รับชื่อภาพผ่าน GET $image = $_GET["image"]; // สร้างลายน้ำ $watermark = imagecreatefrompng("watermark.png"); // รับความสูงและความกว้างของลายน้ำ $watermark_width = imagesx($watermark); $watermark_height = imagesy($ลายน้ำ); // สร้าง jpg จากภาพต้นฉบับ $image_path = "/path/to/image/folder/" $รูปภาพ; $image = imagecreatefromjpeg($image_path); //หากมีสิ่งผิดพลาด if ($image === false) ( return false; ) $size = getimagesize($image_path); // ใส่ลายน้ำบนภาพ $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5; imagealphablending($image, จริง); imagealphablending($ลายน้ำ, จริง); // สร้างสำเนารูปภาพใหม่ ($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($ภาพ); // หน่วยความจำฟรี imagedestroy($image); ภาพทำลาย ($ ลายน้ำ);

ตอนนี้เพื่อแสดงภาพถ่ายที่จะมีลายน้ำโดยไม่เปลี่ยนภาพต้นฉบับ ให้ใช้รหัสต่อไปนี้

เจ้าของไซต์ (ฟอรัม กระดานข่าว ฯลฯ) มักจะประสบปัญหาในการใส่ลายน้ำรูปภาพไซต์ขนาดใหญ่ทั้งหมด

แน่นอน ปัญหานี้สามารถแก้ไขได้ด้วยการสร้างลายน้ำบนภาพแต่ละภาพด้วยตนเอง อย่างไรก็ตาม ประการแรก ใช้เวลานาน และประการที่สอง จำเป็นต้องจัดเก็บภาพสองเวอร์ชันโดยมีและไม่มีลายน้ำ

วิธีแก้ไขปัญหานี้คือการใช้ลายน้ำแบบไดนามิกกับรูปภาพก่อนที่จะโอนไปยังผู้เยี่ยมชมไซต์

มีวิธีแก้ไขปัญหานี้บนอินเทอร์เน็ตในรูปแบบของไฟล์สองไฟล์ซึ่งมีเนื้อหาดังต่อไปนี้
ซอร์สโค้ดของไฟล์ ".htaccess"

DirectoryIndex index.php RewriteEngine บน RewriteCond %(REQUEST_FILENAME) -f RewriteRule ^(.*)$ /watermark/_watermark.php

ซอร์สโค้ดของไฟล์ "_watermark.php"

250) && ($ info_o> 250)) (// สำหรับรูปภาพที่ไม่มีช่องอัลฟา // พารามิเตอร์สุดท้ายของฟังก์ชันคือระดับความทึบของลายน้ำ Watercopymerge ($ ออก, $ ลายน้ำ, ($ info_o- $ info_w)/2, ($ info_o- $ info_w)/2, 2, 2, 2, 2, 2, 2 0, 0, $ info_w, $ info_w , 25); // สำหรับรูปภาพที่มีช่องอัลฟ่า // ในกรณีนี้ ความโปร่งใสถูกควบคุมโดยช่องอัลฟาของรูปภาพเอง // ImageCopy ($ out, $ Watermark, ($ info_o- $ info_w)/2, ($ info_o- $ info_w) /2, 0, 0, $ info_w, $ info_w);) Switch ($ info_o) (กรณีที่ 1: Imagegif ($ out); Break; กรณีที่ 2: Imagejpeg ($ out ); Break; กรณีที่ 3: Imagepng ($ out); ULT: Return FALSE;) ImageDestroy ($ out); imageDestroy ($ ดั้งเดิม); imageDestroy($ลายน้ำ); กลับจริง; ) ?>

วิธีแก้ไขปัญหามีดังนี้ ไฟล์ ".htaccess" จะอยู่ในไดเร็กทอรีที่มีไฟล์รูปภาพ นอกจากนั้น โฟลเดอร์ "ลายน้ำ" จะถูกสร้างขึ้นบนเซิร์ฟเวอร์ ซึ่งมีไฟล์สคริปต์ "_watermark.php" และไฟล์ลายน้ำจริง "watermark.png"

ในเวลาเดียวกัน เมื่อเทียบกับเวอร์ชันดั้งเดิมที่พบในอินเทอร์เน็ต ฉันทำการเปลี่ยนแปลงเล็กน้อยกับไฟล์ข้อความทั้งสองไฟล์

ในไฟล์ ".htaccess" ส่วนขยาย "jpeg" ได้ถูกเพิ่มลงในนิพจน์ทั่วไปของการค้นหาไฟล์รูปภาพ เช่นเดียวกับที่พบเห็นได้ทั่วไป

สคริปต์ "_watermark.php" ได้รับการออกแบบใหม่เพื่อวางลายน้ำไว้ตรงกลางภาพ (ซึ่งจำเป็นสำหรับงานเฉพาะที่ต้องแก้ไข) และความสามารถในการปรับความโปร่งใสของลายน้ำที่สร้างขึ้น (ความคิดเห็นในเนื้อหาสคริปต์จะช่วยคุณตั้งค่าพารามิเตอร์นี้ด้วยตัวเอง)

คุณควรใส่ใจกับข้อเท็จจริงที่ว่าการวางโฟลเดอร์ "ลายน้ำ" ในโฟลเดอร์รูปภาพตามคำแนะนำของแหล่งข้อมูลต้นฉบับจะไม่ได้ผลลัพธ์ตามที่ต้องการเพราะ ในกรณีนี้เราจะต้องมีไฟล์ ".htaccess" และโฟลเดอร์ "ลายน้ำ" ในแต่ละโฟลเดอร์ นี่เป็นเพราะไฟล์ ".htaccess" มีเส้นทางที่สมบูรณ์จากไดเรกทอรีรากของไซต์ไปยังไฟล์ "_watermark.php" ดังนั้น การมีโฟลเดอร์ย่อย "ลายน้ำ" แยกต่างหากในแต่ละโฟลเดอร์ที่มีรูปภาพ หากเราต้องการเปลี่ยนลายน้ำ (หรือสคริปต์ที่วางซ้อนบนรูปภาพ) เราจะต้องทำการเปลี่ยนแปลงในทุกโฟลเดอร์

เพื่อหลีกเลี่ยงปัญหานี้ ฉันแนะนำให้สร้างโฟลเดอร์ "ลายน้ำ" ในไดเร็กทอรีรากของไซต์ และวางไฟล์ ".htaccess" ในไดเร็กทอรีรูปภาพโดยไม่ต้องเปลี่ยนทุกครั้ง ในกรณีนี้ หากต้องการเปลี่ยนลายน้ำหรือสคริปต์ เราจะต้องทำการเปลี่ยนแปลงในที่เดียวบนเว็บไซต์ ในกรณีนี้ คุณสามารถสร้างลายน้ำที่แตกต่างกันสำหรับโฟลเดอร์ต่างๆ ด้วยรูปภาพ โดยอ้างอิงสคริปต์ที่แตกต่างกันจากไฟล์ ".htaccess" ที่แตกต่างกัน เช่น "_watermark-1.php", "_watermark-2.php" เป็นต้น

สรุปแล้ว เราสามารถพูดได้ว่าในการใส่ลายน้ำกับรูปภาพทั้งหมดของไซต์ คุณต้องดาวน์โหลดไฟล์เก็บถาวรที่แนบมาด้านล่าง คลายไฟล์ วางโฟลเดอร์ "ลายน้ำ" ในไดเร็กทอรีรากของไซต์ แทนที่ไฟล์ลายน้ำ "watermark.png" ด้วยไฟล์ของคุณเอง และวางไฟล์ ".htaccess" ในไดเร็กทอรีของไซต์ รูปภาพที่ควรทำเครื่องหมายด้วยลายน้ำ

คุณสามารถดาวน์โหลดไฟล์เก็บถาวรที่มีไฟล์ที่จำเป็นทั้งหมดได้จากสิ่งนี้

หากคุณต้องการเพิ่มลายน้ำให้กับรูปภาพโดยไม่ต้องใช้โปรแกรมแก้ไขรูปภาพหรือเพิ่มในขณะที่อัปโหลดรูปภาพไปยังเซิร์ฟเวอร์ บทเรียนนี้เหมาะสำหรับคุณ

ในบทช่วยสอนนี้ ฉันจะแสดงวิธีเพิ่มลายน้ำให้กับรูปภาพโดยไม่ต้องเปลี่ยนรูปภาพต้นฉบับ ก่อนอื่น คุณต้องมีรูปภาพที่จะใช้เป็นลายน้ำ

จากนั้นเราสร้างส่วนหัวของไฟล์:

// บรรทัดนี้จะบอกเบราว์เซอร์ว่าเรากำลังส่ง jpg image header("content-type: image/jpeg");

จากนั้นเราสร้างภาพ png และรับขนาด:

// สร้างลายน้ำ png $watermark = imagecreatefrompng("watermark.png"); // รับความกว้างและความสูง $watermark_width = imagesx($watermark); $watermark_height = imagesy($ลายน้ำ);

เราจะทำเช่นเดียวกันกับภาพต้นฉบับ แต่เฉพาะในรูปแบบ jpg นี่เป็นเรื่องปกติสำหรับรูปภาพที่อัปโหลดผ่านแบบฟอร์ม เราดำเนินการดังนี้:

// สร้างภาพ jpg $image_path = "original.jpg"; $image = imagecreatefromjpeg($image_path); // รับขนาดภาพ $size = getimagesize($image_path);

ตอนนี้เราต้องวางลายน้ำบนภาพ:

// ใส่ลายน้ำที่ด้านล่างขวา ช่องว่างภายใน 5px $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5;

จากนั้นเราจะตั้งค่าตัวเลือกการผสมสำหรับทั้งสองภาพ:

imagealphablending($image, จริง); imagealphablending($ลายน้ำ, จริง);

ในตอนท้าย เราสร้างภาพใหม่โดยใช้พารามิเตอร์:

// สร้างสำเนารูปภาพใหม่ ($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($ภาพ);

สิ่งสำคัญคือต้องออกไป:

// หน่วยความจำฟรี imagedestroy($image); ภาพทำลาย ($ ลายน้ำ);

คุณสามารถใช้ Photoshop เพื่อปรับความโปร่งใสของลายน้ำ

นั่นคือทั้งหมดที่เกี่ยวกับทฤษฎี ตอนนี้เราจะใช้ความรู้ของเราในโครงการจริง ทั้งหมดนี้จะต้องบันทึกลงในไฟล์ ตัวอย่างเช่น ชื่อ watermark.php

ส่วนหัว ("ประเภทเนื้อหา: รูปภาพ / jpeg"); // รับชื่อภาพผ่าน GET $image = $_GET["image"]; // สร้างลายน้ำ $watermark = imagecreatefrompng("watermark.png"); // รับความสูงและความกว้างของลายน้ำ $watermark_width = imagesx($watermark); $watermark_height = imagesy($ลายน้ำ); // สร้าง jpg จากภาพต้นฉบับ $image_path = "/path/to/image/folder/" $รูปภาพ; $image = imagecreatefromjpeg($image_path); //หากมีสิ่งผิดพลาด if ($image === false) ( return false; ) $size = getimagesize($image_path); // ใส่ลายน้ำบนภาพ $dest_x = $size - $watermark_width - 5; $dest_y = $size - $watermark_height - 5; imagealphablending($image, จริง); imagealphablending($ลายน้ำ, จริง); // สร้างสำเนารูปภาพใหม่ ($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagejpeg($ภาพ); // หน่วยความจำฟรี imagedestroy($image); ภาพทำลาย ($ ลายน้ำ);

ตอนนี้เพื่อแสดงภาพถ่ายที่จะมีลายน้ำโดยไม่เปลี่ยนภาพต้นฉบับ ให้ใช้รหัสต่อไปนี้