目前我想创建一个质量最低的透明png.
代码:
<?php
function createImg ($src, $dst, $width, $height, $quality) {
$newImage = imagecreatetruecolor($width,$height);
$source = imagecreatefrompng($src); //imagecreatefrompng() returns an image identifier representing the image obtained from the given filename.
imagecopyresampled($newImage,$source,0,0,0,0,$width,$height,$width,$height);
imagepng($newImage,$dst,$quality); //imagepng() creates a PNG file from the given image.
return $dst;
}
createImg ('test.png','test.png','1920','1080','1');
?>
Run Code Online (Sandbox Code Playgroud)
但是,有一些问题:
在创建任何新文件之前,我是否需要特定一个png文件?或者我可以创建没有任何现有的png文件?
警告:imagecreatefrompng(test.png):无法打开流:没有这样的文件或目录
第4行的C:\ DSPadmin\DEV\ajax_optipng1.5\create.php
虽然有错误信息,但它仍然会生成一个png文件,但是,我发现该文件是一个黑色的图像,我是否需要具体的任何参数才能使其透明?
谢谢.
试图了解PNG格式.
考虑这个PNG图像:
图像取自这里
在十六进制编辑器中,它看起来像这样:
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 80 00 00 00 44 08 02 00 00 00
C6 25 AA 3E 00 00 00 C2 49 44 41 54 78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F
B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE …
Run Code Online (Sandbox Code Playgroud) 我知道可以使用imagecreatefromjpeg(),imagecreatefrompng()等将URL作为'filename'和fopen(),但由于安全问题,我无法启用包装器.有没有办法将URL传递给imagecreatefromX()而不启用它们?
我也尝试过使用cURL,这也给我带来了问题:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.../image31.jpg"); //Actually complete URL to image
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
$image = imagecreatefromstring($data);
var_dump($image);
imagepng($image);
imagedestroy($image);
Run Code Online (Sandbox Code Playgroud) 我使用此代码从另一个png图像创建图像,默认情况下背景为黑色.我的问题是如何设置透明背景?
$input = imagecreatefrompng('image.png');
$output = imagecreatetruecolor(50, 50);
imagecopy($output, $input, 4,0, 8,8, 8,8);
imagecopy... etc.
header('Content-Type: image/png');
imagepng($output);
Run Code Online (Sandbox Code Playgroud)
这样做有简单的方法吗?谢谢
在我的脚本中,我有以下几行:
$test = @imagecreatefrompng($name);
if ($test) { ... }
Run Code Online (Sandbox Code Playgroud)
我确信它$name
代表磁盘上的现有文件,但我必须处理该文件不是有效PNG文件的情况(由于传输错误或恶意用户).我希望通过不做任何事情来处理这些案件.
但是,鉴于上面的代码,我的PHP解释器在第一行停止,并显示以下错误消息:
imagecreatefrompng()[function.imagecreatefrompng]:'foobar.png'不是有效的PNG文件
不应该@
已经抑制了此错误消息,并且false
如文档中所述返回了函数吗?我怎么能告诉PHP我知道可能发生错误而不中断执行?
我正在使用imagecreatefromgif/imagecreatefromjpeg/imagecreatefromjpeg函数和上传的图像,有时在图像损坏时会出现错误(例如警告:imagecreatefromgif():...不是有效的GIF文件).我阅读了很多关于这个主题的帖子,找不到"有效"的答案.
我确实尝试了以下一些来验证图像(如其他帖子所示),但它们都不适用于所有情况.如果图像没有标题信息,则以下工作,但如果图像具有标题/ mime类型信息并且已损坏,则它不起作用.
if( imagecreatefromjpeg($uploaded_image) !== false ) {
// image is okay.
}
Run Code Online (Sandbox Code Playgroud)
要么
try {
$test = imagecreatefrompng($uploaded_image);
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
Run Code Online (Sandbox Code Playgroud)
要么
使用getimagesize($ uploaded_image); //如果图像无效,将返回false或错误.
这些情况都不适用于具有头信息/ mime类型信息的损坏的图像文件.
我想防止出现这些错误,如果可能的话,检测图像是否没有损坏,并且可以使用任何imagecreatefromgif/imagecreatefromjpeg/imagecreatefromjpeg函数.如果损坏,我想显示错误消息而不是运行功能.我正在寻找PHP的解决方案.
感谢您的帮助和建议.
我正在使用 imagecreatefromstring 并当前验证正确的图像文件格式。
所以一个链接:
swqkdwfibqwfwf
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它不是有效的文件类型。但我刚刚发现了这一点:
sibdlsibiwbifw.png
Run Code Online (Sandbox Code Playgroud)
将在我的验证中没有错误地发送。对于不返回图像的图像链接,我收到此错误:
Warning: file_get_contents(etwteet.png): failed to open stream: No such file or directory in /var/www/clients/client2/web3/web/process/addnewbuild.php on line 141
Warning: imagecreatefromstring(): Empty string or invalid image in /var/www/clients/client2/web3/web/process/addnewbuild.php on line 141
Warning: imagejpeg() expects parameter 1 to be resource, boolean given in /var/www/clients/client2/web3/web/process/addnewbuild.php on line 143
Run Code Online (Sandbox Code Playgroud)
有没有办法可以捕获此错误,以便我可以停止代码处理并通知用户?
用于获取 URL 的代码:
$imagefile = image url;
$resource = imagecreatefromstring(file_get_contents($imagefile));
Run Code Online (Sandbox Code Playgroud)
谢谢。克雷格.
我开始使用此功能创建PNG缩略图:
$image = imagecreatefrompng("http://imagenic.net/images/pfujz9j5juav1qrex00.png");
Run Code Online (Sandbox Code Playgroud)
但是,它说:
'http://imagenic.net/images/pfujz9j5juav1qrex00.png' is not a valid PNG file
Run Code Online (Sandbox Code Playgroud)
它适用于其他PNG图像,所以我想这个特定图片有问题.
在这种情况下我该怎么办?
有没有其他方法来创建缩略图?
(顺便说一句,我在网上发现了这张照片.)
我目前有一个图像上传输入,只接受PNG,JPG/JPEG,GIF图像.如果文件有效,则会继续使用图像创建缩略图
imagecreatefrompng()
imagecopy()
imagejpg()
Run Code Online (Sandbox Code Playgroud)
这很好,但显然只适用于png图像.
除了使用提交的正确文件格式之外,使用"imagecreatefrompng()"的最合理和最有效的方法是什么?我能想到的是if/else使用多个"imagecreatefrom_ _()"但这似乎不对.
另外,无论提交的是什么,我的输出格式如何总是PNG,而不是我现在拥有的当前imagejpg().
我有一个php页面,它接收用户图像并将其上传到我的网络服务器.
我刚刚注意到,如果我有一个透明背景的png,并上传它,背景将变为白色.
例如,我在具有透明背景的photoshop中创建新图像,然后在页面中添加彩色圆圈.我通过ftp将图像保存为png和uplod到服务器,然后图像在网页上显示为圆形,因为背景是透明的.
如果我使用带文件输入框的php上传图像,图像将变为白色.
我曾尝试使用imagealphablending,imagecolorallocatealpha,imagefill和imagesavealpha来保留透明背景,但它只是将bg更改为黑色.
任何线索?
继承我的PHP代码
<?php
$path = "../userfiles/orig/";
$userpath="../".$_REQUEST['userpath']."/";
function getExtension($str) {
$i = strrpos($str,".");
if (!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
$valid_formats = array("jpg", "png", "gif", "bmp","jpeg","PNG","JPG","JPEG","GIF","BMP");
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
$name = $_FILES['photoimg']['name'];
$size = $_FILES['photoimg']['size'];
if(strlen($name)){
$ext = getExtension($name);
if(in_array($ext,$valid_formats)){
if($size<(2048*2048)){
$time1=time();
$actual_image_name =$time1."_".str_replace(" ", "_", $name);
$tmp = $_FILES['photoimg']['tmp_name'];
if(move_uploaded_file($tmp, $path.$actual_image_name)){
$image=$actual_image_name;
/*--------resize image-----------*/
$size = 320; // the imageheight
$filedir = …
Run Code Online (Sandbox Code Playgroud)