PHP 图片
需求描述:使用PHP对图片文件进行优化处理,但此优化处理只能进行一次,二次进行会对图片造成不可恢复的损坏。期望在图片一次处理之后,在图片文件中写入一个自定义的字符串,什么都行,仅用于判断图片是否经过处理。
期待可以使用PHP解决。目前想到JPEG格式的话有 EXIF信息,可以尝试从这个作为突破,在EXIF信息中写入一个自定义的字符串。但GIF,PNG,BMP呢,怎么能解决常用的网络图片格式?
google到这货
Imagick::setImageProperty
根据文档http://www.php.net/manual/zh/imagick.setimageproperty.php
貌似刚好符合要求,但是使用这个函数保存图片,再次读取却为空,不晓得是不是我的用法有问题
$image = new Imagick($file);$image->setImageProperty('Exif:Make', 'Imagick');$image->writeImage($file2);$image2 = new Imagick($file2);echo $image->getImageProperty('Exif:Make');
这个是一个思路,但没能实现,真希望是我用法有问题,而不是这个函数不可实现。
又尝试使用 APP13
$size = getimagesize('1.jpg', $info);var_dump($size);if(isset($info['APP13'])){ $iptc = iptcparse($info['APP13']); var_dump($iptc);}
但也不行。
难道我一直在走弯路?有什么好的办法吗?要的不多,就是想在不破快图片的基础上在图片数据中写入一个字符串,供下次读取这个字符串。
大大们现身吧,给点指点,解决问题立刻散分。
回复讨论(解决方案)
对于 GD 支持的图片,均可以在图片数据结束后附加自定义数据,而不影响图片的内容
示例代码
$url = 'http://avatar.profile.csdn.net/0/E/F/1_jaylecn.jpg';$im = imagecreatefromjpeg($url);imagepng($im, 'test.png'); //产生一个 png 图片文件$s = 'abcefg'; //待附加的信息file_put_contents('test.png', sprintf('%sInfo%s', $s, pack('n', strlen($s))), FILE_APPEND); //按自定义格式附加在图片文件之后//回读$s = file_get_contents('test.png');$t = unpack('A4t/noffs', substr($s, -6)); //取回自定义信息的长度$v = substr($s, -6 - $t['offs'], -6); //取回自定义信息echo $v;//abcdef
请自行验证图片数据没有被破坏
其实大致有这样一个概念:可以边读取边展示的基本是流式数据,这样的数据,头文件将说明了mimetype和长度(或有结束标志),那么在长度(或结束标志)之后的“额外”数据并不影响主体数据的展示,依此概念,甚至rar、zip等也能做手脚,呵呵
谢谢两位回答,看样子思路是一样的,就是在文件的数据格式之外插入一段字符。
开始也想到过这个办法,手工编辑了一个几个文件,其中有一个GIF动态图插入之后,图片遭到损坏。当时认为这种方法不可行,就没继续深入。我又使用了那张手工修改被破坏的GIF图,用xuzuning的代码测试了一下,竟然是可以的,看来手工修改确实不行。
这个方案看来基本可行了,那么问题就是 我恐怕 没办法去测试所有的图片格式,这种方法是否具有确定性呢?(GD只要支持,就一定没问题?)
PS:我先去测试几种格式的图片试试。
用Imagick类可以实现,需要PHP安装imagemagick扩展模块
我在发帖的时候就已经说了,google到了一个 Imagick 的函数,但实际上是无法写入的,不知道楼上说的用Imagick实现是怎么实现的?
是的,GD 支持的图片都是可以的(gif、jpg、png)
因为此类图片都是压缩保存的,在文件头部都有一个数据区长度的表识。
图片显示时,软件通过该标识读取并解压数据
但对于 GD 不支持的,比如 bmp 文件,就没有那么幸运了。
bmp 的数据是从文件尾向文件头方向排列的,如果你在文件尾部添加内容,就将破坏图片数据
其实最简单的测试方法就是准备你的二进制数据和原始文件,然后用DOS命令
copy /b 原始文件 + 二进制数据 新文件
然后检查这个新文件有没问题
先用这种方案吧,有个PHP类或者什么的,可以兼容各种图片格式就好了。这个需求我觉得倒还挺常见的,比如批量给图片打水印,可以给图片加个属性来判断是否已经水印过了。
结贴,感谢两位

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。