使用 PHP 将字符串转换为图像
Convert string to image with PHP
我有一个 PHP 脚本可以在服务器端创建一个有效的图像文件。以下代码运行良好:
$filename = $_GET['filename'];
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
$image = @imagecreatetruecolor(10, 10)
or die('Cannot Initialize new GD image stream');
if (strpos($image, '/gif') !== false) {
$image_type = "GIF";
header('Content-Type: image/gif');
$successful = imagegif($image, "./$filename");
} else if (strpos($image, '/jpeg') !== false) {
$image_type = "JPG";
header('Content-Type: image/jpeg');
$successful = imagejpeg($image, "./$filename");
} else if (strpos($image, '/png') !== false) {
$image_type = "PNG";
header('Content-Type: image/png');
$successful = imagepng($image, "./$filename");
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
imagedestroy($image);
echo "image destroyed.";
} else {
echo "$filename is null.";
}
这工作正常并且创建了一个带有 $filename 的图像。但实际上,我不仅要接收文件名,还要接收图像。所以,真正的代码是
$filename = $_GET['filename'];
$image = $_GET['image'];
echo "file $filename = '$image'.";
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
if (strpos($image, '/gif') !== false) {
$image_type = "GIF";
header('Content-Type: image/gif');
$successful = imagegif($image, "./$filename");
} else if (strpos($image, '/jpeg') !== false) {
$image_type = "JPG";
header('Content-Type: image/jpeg');
$successful = imagejpeg($image, "./$filename");
} else if (strpos($image, '/png') !== false) {
$image_type = "PNG";
header('Content-Type: image/png');
$successful = imagepng($image, "./$filename");
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
imagedestroy($image);
echo "image destroyed.";
} else {
echo "$filename is null.";
}
这个不行,结果是
file t.png = 'data:image/jpeg;base64,/9j/4AAQSkZJ … qA/Cz//Z'.t.png is not null.Image written to 't.png'.image destroyed.
如何从 'data:image/jpeg … ' 字符串创建 PHP 中的有效图像?
编辑 1: 我在上面的代码中添加了一行以查看它不可能与 another question:
重复
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
$image = base64_decode($image); // <<<<
编辑 2: 我修改了代码以便删除文件:
$filename = $_GET['filename'];
$image = $_GET['image'];
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
$image = base64_decode($image);
$slash1 = strpos($image, '/');
$image_type = substr($image, $slash1, strpos($image, ';') - $slash1);
if (file_exists($filename)) unlink($filename);
header('Content-Type: image/' . $image_type);
switch ($image_type) {
case "gif":
$successful = imagegif($image, "./$filename");
break;
case "jpeg":
case "jpg":
$successful = imagejpeg($image, "./$filename");
break;
case "png":
$successful = imagepng($image, "./$filename");
break;
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
imagedestroy($image);
echo "image destroyed.";
} else {
echo "$filename is null.";
}
但是,我还是收到了回复 Could not write image to 't.jpg'
。
EDIT 3: 这是我传递给两个参数的内容:
?filename=t.jpg&image=data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/7AARRHVja3kAAQAEAAAAPAAA/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAAP/bAEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwHCQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAAEAAQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APA6KKK/qA/Cz//Z
编辑 4: 根据@delboy1978uk 的建议修改了代码。此外,传递的 文件名 包含图像文件扩展名是不正确的,因为这应该始终对应于图像类型:
$filename = $_GET['filename'];
$image = $_GET['image'];
echo "file $filename = '$image'.";
// Only proceed if we got valid input
if ($filename !== null) {
$slash = strpos($image, '/') + 1;
$image_type = substr($image, $slash, strpos($image, ';') - $slash);
$comma = strpos($image, ',') + 1;
$image = substr($image, $comma);
$decoded_image = base64_decode($image);
$image = imagecreatefromstring($decoded_image);
echo "The image type is '$image_type'.";
if (file_exists($filename)) {
unlink($filename);
echo "Deleted file '$filename'.";
}
header('Content-Type: image/' . $image_type);
$filename .= '.' . $image_type;
switch ($image_type) {
case "gif":
$successful = imagegif($image, "./$filename");
break;
case "jpeg":
case "jpg":
$successful = imagejpeg($image, "./$filename");
break;
case "png":
$successful = imagepng($image, "./$filename");
break;
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
if (imagedestroy($image) === true) {
echo "Image destroyed.";
}
} else {
echo "$filename is null.";
}
您正在尝试在您已将输出发送到的页面上发送 headers。
如果您从文件加载,您需要使用 imagecreatefromjpeg()
以及 GIF 和 PNG 等价物。 http://php.net/manual/en/function.imagecreatefromjpeg.php
$img = imagecreatefromjpeg($file);
要让实际的字符串数据在您的 <image>
标签中逐字回显,请使用输出缓冲:
ob_start();
imagejpeg($img)
$image = ob_get_clean();
echo '<img src="data:image/jpeg;base64,' . base64_encode( $i ).'" />';
如果你有兴趣,我在几年前制作了一个图像 class 来处理这些东西,请看这里 https://github.com/delboy1978uk/image/blob/master/src/Image.php and a blog about it https://delboy1978uk.wordpress.com/2014/12/01/outputting-images-as-base64-encoded-strings/
问题解决!!这是获取浏览器缓存图像并将其发送到请求的服务器位置的代码。从服务器取回图片,原来是同一张图片。首先是 JavaScript 代码:
[…]
var parameters = {
[…],
headerImageLocation: '',
image: new Image(),
[…],
};
if (strings.hasMinimalLength(blobURL, 9)) {
this.getBlobFromURL(blobURL).then(this.fromBlobToBase64).then(function(result) {
parameters['image'].src = result;
parameters['headerImageLocation'] = './' + strings.generateID();
server.continueWithNewsTicker(parameters);
});
} else {
this.continueWithNewsTicker(parameters);
}
// Prototype "MainServer":
MainServer.method('continueWithNewsTicker', function(parameters) {
var url = server.ServiceTest + 'saveHeaderImage.php';
if (strings.hasMinimalLength(parameters['headerImageLocation'], 1)) {
var formData = new FormData();
formData.append('filename', parameters['headerImageLocation']);
formData.append('image', parameters['image'].src);
this.uploadFile(formData, url);
}
[…]
});
// Prototype "Server":
Server.method('uploadFile', function (data, url) {
var xhr = new XMLHttpRequest(); // AJAX request
xhr.open('POST', url);
xhr.send(data);
});
// Prototype "Strings":
Strings.method('generateID', function () {
function s4() {
return Math.floor((1 + Math.random())*0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
});
对于那些感兴趣的人,PHP代码如下:
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Get the input data safely
$filename = $_POST['filename'];
$image = $_POST['image'];
// Only proceed if we got valid input
if ($filename !== null) {
// Prepare to remove "header" information:
$comma = strpos($image, ',') + 1;
$slash = strpos($image, '/') + 1;
// The image type will also determine the file extension
$image_type = substr($image, $slash, strpos($image, ';') - $slash);
// Remove "header" information from rest of image:
$image = substr($image, $comma);
$decoded_image = base64_decode($image);
$filename .= '.' . $image_type;
if (file_exists($filename)) unlink($filename);
$successful = file_put_contents($filename, $decoded_image);
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
} else {
echo "$filename is null.";
}
我有一个 PHP 脚本可以在服务器端创建一个有效的图像文件。以下代码运行良好:
$filename = $_GET['filename'];
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
$image = @imagecreatetruecolor(10, 10)
or die('Cannot Initialize new GD image stream');
if (strpos($image, '/gif') !== false) {
$image_type = "GIF";
header('Content-Type: image/gif');
$successful = imagegif($image, "./$filename");
} else if (strpos($image, '/jpeg') !== false) {
$image_type = "JPG";
header('Content-Type: image/jpeg');
$successful = imagejpeg($image, "./$filename");
} else if (strpos($image, '/png') !== false) {
$image_type = "PNG";
header('Content-Type: image/png');
$successful = imagepng($image, "./$filename");
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
imagedestroy($image);
echo "image destroyed.";
} else {
echo "$filename is null.";
}
这工作正常并且创建了一个带有 $filename 的图像。但实际上,我不仅要接收文件名,还要接收图像。所以,真正的代码是
$filename = $_GET['filename'];
$image = $_GET['image'];
echo "file $filename = '$image'.";
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
if (strpos($image, '/gif') !== false) {
$image_type = "GIF";
header('Content-Type: image/gif');
$successful = imagegif($image, "./$filename");
} else if (strpos($image, '/jpeg') !== false) {
$image_type = "JPG";
header('Content-Type: image/jpeg');
$successful = imagejpeg($image, "./$filename");
} else if (strpos($image, '/png') !== false) {
$image_type = "PNG";
header('Content-Type: image/png');
$successful = imagepng($image, "./$filename");
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
imagedestroy($image);
echo "image destroyed.";
} else {
echo "$filename is null.";
}
这个不行,结果是
file t.png = 'data:image/jpeg;base64,/9j/4AAQSkZJ … qA/Cz//Z'.t.png is not null.Image written to 't.png'.image destroyed.
如何从 'data:image/jpeg … ' 字符串创建 PHP 中的有效图像?
编辑 1: 我在上面的代码中添加了一行以查看它不可能与 another question:
重复// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
$image = base64_decode($image); // <<<<
编辑 2: 我修改了代码以便删除文件:
$filename = $_GET['filename'];
$image = $_GET['image'];
// Only proceed if we got valid input
if ($filename !== null) {
echo "$filename is not null.";
$image = base64_decode($image);
$slash1 = strpos($image, '/');
$image_type = substr($image, $slash1, strpos($image, ';') - $slash1);
if (file_exists($filename)) unlink($filename);
header('Content-Type: image/' . $image_type);
switch ($image_type) {
case "gif":
$successful = imagegif($image, "./$filename");
break;
case "jpeg":
case "jpg":
$successful = imagejpeg($image, "./$filename");
break;
case "png":
$successful = imagepng($image, "./$filename");
break;
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
imagedestroy($image);
echo "image destroyed.";
} else {
echo "$filename is null.";
}
但是,我还是收到了回复 Could not write image to 't.jpg'
。
EDIT 3: 这是我传递给两个参数的内容:
?filename=t.jpg&image=data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/7AARRHVja3kAAQAEAAAAPAAA/+0ALFBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAAP/bAEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwHCQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAAEAAQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APA6KKK/qA/Cz//Z
编辑 4: 根据@delboy1978uk 的建议修改了代码。此外,传递的 文件名 包含图像文件扩展名是不正确的,因为这应该始终对应于图像类型:
$filename = $_GET['filename'];
$image = $_GET['image'];
echo "file $filename = '$image'.";
// Only proceed if we got valid input
if ($filename !== null) {
$slash = strpos($image, '/') + 1;
$image_type = substr($image, $slash, strpos($image, ';') - $slash);
$comma = strpos($image, ',') + 1;
$image = substr($image, $comma);
$decoded_image = base64_decode($image);
$image = imagecreatefromstring($decoded_image);
echo "The image type is '$image_type'.";
if (file_exists($filename)) {
unlink($filename);
echo "Deleted file '$filename'.";
}
header('Content-Type: image/' . $image_type);
$filename .= '.' . $image_type;
switch ($image_type) {
case "gif":
$successful = imagegif($image, "./$filename");
break;
case "jpeg":
case "jpg":
$successful = imagejpeg($image, "./$filename");
break;
case "png":
$successful = imagepng($image, "./$filename");
break;
}
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
if (imagedestroy($image) === true) {
echo "Image destroyed.";
}
} else {
echo "$filename is null.";
}
您正在尝试在您已将输出发送到的页面上发送 headers。
如果您从文件加载,您需要使用 imagecreatefromjpeg()
以及 GIF 和 PNG 等价物。 http://php.net/manual/en/function.imagecreatefromjpeg.php
$img = imagecreatefromjpeg($file);
要让实际的字符串数据在您的 <image>
标签中逐字回显,请使用输出缓冲:
ob_start();
imagejpeg($img)
$image = ob_get_clean();
echo '<img src="data:image/jpeg;base64,' . base64_encode( $i ).'" />';
如果你有兴趣,我在几年前制作了一个图像 class 来处理这些东西,请看这里 https://github.com/delboy1978uk/image/blob/master/src/Image.php and a blog about it https://delboy1978uk.wordpress.com/2014/12/01/outputting-images-as-base64-encoded-strings/
问题解决!!这是获取浏览器缓存图像并将其发送到请求的服务器位置的代码。从服务器取回图片,原来是同一张图片。首先是 JavaScript 代码:
[…]
var parameters = {
[…],
headerImageLocation: '',
image: new Image(),
[…],
};
if (strings.hasMinimalLength(blobURL, 9)) {
this.getBlobFromURL(blobURL).then(this.fromBlobToBase64).then(function(result) {
parameters['image'].src = result;
parameters['headerImageLocation'] = './' + strings.generateID();
server.continueWithNewsTicker(parameters);
});
} else {
this.continueWithNewsTicker(parameters);
}
// Prototype "MainServer":
MainServer.method('continueWithNewsTicker', function(parameters) {
var url = server.ServiceTest + 'saveHeaderImage.php';
if (strings.hasMinimalLength(parameters['headerImageLocation'], 1)) {
var formData = new FormData();
formData.append('filename', parameters['headerImageLocation']);
formData.append('image', parameters['image'].src);
this.uploadFile(formData, url);
}
[…]
});
// Prototype "Server":
Server.method('uploadFile', function (data, url) {
var xhr = new XMLHttpRequest(); // AJAX request
xhr.open('POST', url);
xhr.send(data);
});
// Prototype "Strings":
Strings.method('generateID', function () {
function s4() {
return Math.floor((1 + Math.random())*0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
});
对于那些感兴趣的人,PHP代码如下:
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Get the input data safely
$filename = $_POST['filename'];
$image = $_POST['image'];
// Only proceed if we got valid input
if ($filename !== null) {
// Prepare to remove "header" information:
$comma = strpos($image, ',') + 1;
$slash = strpos($image, '/') + 1;
// The image type will also determine the file extension
$image_type = substr($image, $slash, strpos($image, ';') - $slash);
// Remove "header" information from rest of image:
$image = substr($image, $comma);
$decoded_image = base64_decode($image);
$filename .= '.' . $image_type;
if (file_exists($filename)) unlink($filename);
$successful = file_put_contents($filename, $decoded_image);
if ($successful) {
echo "Image written to '$filename'.";
} else {
echo "Could not write $image_type image to '$filename'.";
}
} else {
echo "$filename is null.";
}