服务器端如何实现两张或多张图片的叠加PHP?
How to make the superposing of two or more images on server-side PHP?
我在 HTML 中有 <canvas>
从我的网络摄像头通过 JS 图片获取,我需要 select 从可叠加图像列表中获取图片,然后制作图像从叠加。如何在没有任何框架的情况下将两个图像放入 PHP 并使它们叠加?
HTML 我现在有:
<div class="form-group" id="snap-new-photo">
<video style="background-color: #777" id="video" width="640" height="480" autoplay></video>
<button id="snap">Snap Photo</button>
</div>
<script type="text/javascript">
// Put event listeners into place
window.addEventListener("DOMContentLoaded", () => {
// Grab elements, create settings, etc.
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const video = document.getElementById('video');
const snapButton = document.getElementById('snap');
navigator.getMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia );
navigator.getMedia({ video: true },
function(stream) {
if (navigator.mozGetUserMedia) {
video.mozSrcObject = stream
}
else {
video.srcObject = stream
}
video.play();
},
function(err) {
snapButton.disabled = true;
}
);
// Trigger photo take
document.getElementById('snap').addEventListener('click', () => {
context.drawImage(video, 0, 0, 640, 480);
});
}, false);
</script>
好吧,我自己解决了我的问题并解决了两张图片的叠加,一张是从 canvas 获取的,第二张是存储在服务器上的 imagecopy() and imagepng() standart PHP functions. For getting them from canvas element I used simple AJAX function. You can look and suggest improvements of my self-educational project here: https://github.com/znatno/42-camagru
JS代码:
saveSnapBtn.addEventListener('click', () => {
let imageBase64 = convertCanvasToImage(canvas).src;
// Process uploading
ajax('/create/new-upload', `image=${imageBase64}&maskFilename=${maskFilename}`, (json) => {
if (json) {
if (json.status === 'Success') {
alert(json.status + ': ' + json.message);
} else {
alert(json.status + ': ' + json.message);
}
}
draw(video, context);
})
});
PHP代码:
public function createImage($img_base64, $mask_filename) {
if (empty($mask_filename)) {
$this->error = 'No mask selected';
return false;
}
// Base64 to Image
$img_base64 = str_replace('data:image/png;base64,', '', $img_base64);
$img_base64 = str_replace(' ', '+', $img_base64);
$img_data = base64_decode($img_base64);
// Creating Image
$src = imagecreatefrompng('pub/res/masks/src/' . $mask_filename . '.png');
$dest = imagecreatefromstring($img_data);
imagecopy($dest, $src, 0, 0, 0, 0, 640, 480); //have to play with these numbers for it to work for you, etc.
header('Content-Type: image/png');
$filename = uniqid('', true) . '.png';
$path = 'pub/photos/' . $filename;
// Saving to path
$status = imagepng($dest, $path);
imagedestroy($dest);
imagedestroy($src);
// Saving to Database
if ($status) {
$sql = 'INSERT INTO db_ibohun.photos (id, username, user_id, path, timestamp)
VALUES (:id, :username, :user_id, :path, :timestamp)';
$params = [
'id' => 0,
'username' => $_SESSION['user']['username'],
'user_id' => $_SESSION['user']['id'],
'path' => $path,
'timestamp' => date('Y-m-d H:i:s'),
];
$this->db->query($sql, $params);
} else {
$this->error = 'Error during saving. Please, try again';
}
// Return success or error
return $status;
}
我在 HTML 中有 <canvas>
从我的网络摄像头通过 JS 图片获取,我需要 select 从可叠加图像列表中获取图片,然后制作图像从叠加。如何在没有任何框架的情况下将两个图像放入 PHP 并使它们叠加?
HTML 我现在有:
<div class="form-group" id="snap-new-photo">
<video style="background-color: #777" id="video" width="640" height="480" autoplay></video>
<button id="snap">Snap Photo</button>
</div>
<script type="text/javascript">
// Put event listeners into place
window.addEventListener("DOMContentLoaded", () => {
// Grab elements, create settings, etc.
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
const video = document.getElementById('video');
const snapButton = document.getElementById('snap');
navigator.getMedia = ( navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia );
navigator.getMedia({ video: true },
function(stream) {
if (navigator.mozGetUserMedia) {
video.mozSrcObject = stream
}
else {
video.srcObject = stream
}
video.play();
},
function(err) {
snapButton.disabled = true;
}
);
// Trigger photo take
document.getElementById('snap').addEventListener('click', () => {
context.drawImage(video, 0, 0, 640, 480);
});
}, false);
</script>
好吧,我自己解决了我的问题并解决了两张图片的叠加,一张是从 canvas 获取的,第二张是存储在服务器上的 imagecopy() and imagepng() standart PHP functions. For getting them from canvas element I used simple AJAX function. You can look and suggest improvements of my self-educational project here: https://github.com/znatno/42-camagru
JS代码:
saveSnapBtn.addEventListener('click', () => {
let imageBase64 = convertCanvasToImage(canvas).src;
// Process uploading
ajax('/create/new-upload', `image=${imageBase64}&maskFilename=${maskFilename}`, (json) => {
if (json) {
if (json.status === 'Success') {
alert(json.status + ': ' + json.message);
} else {
alert(json.status + ': ' + json.message);
}
}
draw(video, context);
})
});
PHP代码:
public function createImage($img_base64, $mask_filename) {
if (empty($mask_filename)) {
$this->error = 'No mask selected';
return false;
}
// Base64 to Image
$img_base64 = str_replace('data:image/png;base64,', '', $img_base64);
$img_base64 = str_replace(' ', '+', $img_base64);
$img_data = base64_decode($img_base64);
// Creating Image
$src = imagecreatefrompng('pub/res/masks/src/' . $mask_filename . '.png');
$dest = imagecreatefromstring($img_data);
imagecopy($dest, $src, 0, 0, 0, 0, 640, 480); //have to play with these numbers for it to work for you, etc.
header('Content-Type: image/png');
$filename = uniqid('', true) . '.png';
$path = 'pub/photos/' . $filename;
// Saving to path
$status = imagepng($dest, $path);
imagedestroy($dest);
imagedestroy($src);
// Saving to Database
if ($status) {
$sql = 'INSERT INTO db_ibohun.photos (id, username, user_id, path, timestamp)
VALUES (:id, :username, :user_id, :path, :timestamp)';
$params = [
'id' => 0,
'username' => $_SESSION['user']['username'],
'user_id' => $_SESSION['user']['id'],
'path' => $path,
'timestamp' => date('Y-m-d H:i:s'),
];
$this->db->query($sql, $params);
} else {
$this->error = 'Error during saving. Please, try again';
}
// Return success or error
return $status;
}