html拖动图片,在图片上写文字和贴图,然后生成新的图片,文字抵达图片边缘自动换行,可以多文字多贴图。htmlapi提交到php,php保存再输出到html
时间: 2024-04-16 19:28:02 浏览: 139
html代码实现文字转图片的代码,自动换行
要实现在HTML中拖动图片、添加文字和贴图,并生成新的图片,您可以使用HTML5的拖放功能和Canvas API结合使用。下面是一个简单的示例代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>Drag and Drop Image</title>
<style>
#canvas {
border: 2px dashed #ccc;
width: 500px;
height: 500px;
}
</style>
</head>
<body>
<input type="file" id="upload" accept="image/*">
<div id="canvasContainer">
<canvas id="canvas"></canvas>
</div>
<script>
// 获取 canvas 元素和上下文
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
// 定义变量存储图片、文字和贴图
var image = null;
var texts = [];
var overlays = [];
// 监听文件上传控件的change事件
document.getElementById('upload').addEventListener('change', function (e) {
var reader = new FileReader();
reader.onload = function (event) {
// 创建图片对象
image = new Image();
// 图片加载完成后执行回调函数
image.onload = function () {
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制图片
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
// 绘制文字
for (var i = 0; i < texts.length; i++) {
drawText(texts[i]);
}
// 绘制贴图
for (var j = 0; j < overlays.length; j++) {
drawOverlay(overlays[j]);
}
};
// 设置图片源
image.src = event.target.result;
};
// 读取文件内容
reader.readAsDataURL(e.target.files[0]);
});
// 监听canvas的拖放事件
canvas.addEventListener('dragover', function (e) {
e.preventDefault();
});
canvas.addEventListener('drop', function (e) {
e.preventDefault();
// 获取拖放的文件
var file = e.dataTransfer.files[0];
var reader = new FileReader();
reader.onload = function (event) {
// 创建图片对象
var overlay = new Image();
// 图片加载完成后执行回调函数
overlay.onload = function () {
// 添加贴图到数组
overlays.push({
image: overlay,
x: e.offsetX,
y: e.offsetY,
width: 100, // 贴图宽度
height: 100 // 贴图高度
});
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制图片
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
// 绘制文字
for (var i = 0; i < texts.length; i++) {
drawText(texts[i]);
}
// 绘制贴图
for (var j = 0; j < overlays.length; j++) {
drawOverlay(overlays[j]);
}
};
// 设置贴图源
overlay.src = event.target.result;
};
// 读取文件内容
reader.readAsDataURL(file);
});
// 添加文字
function addText() {
var text = prompt('请输入文字');
if (text) {
texts.push({
text: text,
x: 50, // 文字左上角的 x 坐标
y: 50, // 文字左上角的 y 坐标
fontSize: 20,
color: '#ffffff' // 文字颜色
});
// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制图片
ctx.drawImage(image, 0, 0, canvas.width, canvas.height);
// 绘制文字
for (var i = 0; i < texts.length; i++) {
drawText(texts[i]);
}
// 绘制贴图
for (var j = 0; j < overlays.length; j++) {
drawOverlay(overlays[j]);
}
}
}
// 绘制文字
function drawText(textObj) {
ctx.font = textObj.fontSize + 'px Arial';
ctx.fillStyle = textObj.color;
wrapText(ctx, textObj.text, textObj.x, textObj.y, 200, textObj.fontSize + 5);
}
// 绘制贴图
function drawOverlay(overlayObj) {
ctx.drawImage(overlayObj.image, overlayObj.x, overlayObj.y, overlayObj.width, overlayObj.height);
}
// 自动换行文字
function wrapText(context, text, x, y, maxWidth, lineHeight) {
var words = text.split(' ');
var line = '';
for (var n = 0; n < words.length; n++) {
var testLine = line + words[n] + ' ';
var metrics = context.measureText(testLine);
var testWidth = metrics.width;
if (testWidth > maxWidth && n > 0) {
context.fillText(line, x, y);
line = words[n] + ' ';
y += lineHeight;
} else {
line = testLine;
}
}
context.fillText(line, x, y);
}
</script>
<button onclick="addText()">添加文字</button>
<button onclick="saveImage()">保存图片</button>
<script>
// 保存图片
function saveImage() {
// 将 canvas 转为图片
var dataURL = canvas.toDataURL();
// 创建隐藏的表单元素
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'imageData';
input.value = dataURL;
// 将表单元素添加到 body 中
document.body.appendChild(input);
// 提交表单
document.forms[0].submit();
// 移除表单元素
document.body.removeChild(input);
}
</script>
</body>
</html>
```
在上述代码中,您可以使用拖放功能将图片拖放到画布上,并通过`addText()`函数添加文字。在`saveImage()`函数中,将canvas转为图片,并将其作为隐藏的表单元素值提交到PHP处理。
在PHP中,您可以接收提交的表单数据,并保存图片。以下是一个简单的PHP示例代码:
```php
<?php
if(isset($_POST['imageData'])) {
// 接收提交的表单数据
$imageData = $_POST['imageData'];
// 移除 data:image/png;base64, 前缀
$filteredData = substr($imageData, strpos($imageData, ",") + 1);
// 解码 base64 数据
$decodedData = base64_decode($filteredData);
// 生成文件名
$filename = 'path/to/save/image.png';
// 保存图片
file_put_contents($filename, $decodedData);
// 输出图片路径
echo '保存的图片路径:' . $filename;
}
?>
```
您需要根据实际情况,替换代码中的路径和文件名,以及对数据进行验证、处理和存储。该示例代码仅供参考,您可以根据自己的需求进行修改和扩展。
阅读全文