如何用PHP项目实现AI绘画?

wen java案例 2

本文目录导读:

如何用PHP项目实现AI绘画?

  1. 调用第三方AI绘画API(最常用方案)
  2. 本地Stable Diffusion WebUI方案
  3. 完整Web应用示例
  4. 使用Composer包
  5. 推荐的最佳实践
  6. 常见API提供商

我来介绍几种在PHP项目中实现AI绘画的方法,从简单到完整方案逐步说明。

调用第三方AI绘画API(最常用方案)

Stable Diffusion API 示例

<?php
class AIPainting {
    private $apiKey;
    private $apiUrl;
    public function __construct($apiKey, $apiUrl = 'https://api.stability.ai/v1') {
        $this->apiKey = $apiKey;
        $this->apiUrl = $apiUrl;
    }
    // 生成图像
    public function generateImage($prompt, $options = []) {
        $data = [
            'text_prompts' => [
                ['text' => $prompt, 'weight' => 1]
            ],
            'cfg_scale' => $options['cfg_scale'] ?? 7,
            'height' => $options['height'] ?? 512,
            'width' => $options['width'] ?? 512,
            'samples' => $options['samples'] ?? 1,
            'steps' => $options['steps'] ?? 50,
        ];
        if (!empty($options['negative_prompt'])) {
            $data['text_prompts'][] = [
                'text' => $options['negative_prompt'],
                'weight' => -1
            ];
        }
        $ch = curl_init($this->apiUrl . '/generation/stable-diffusion-v1-6/text-to-image');
        curl_setopt_array($ch, [
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Authorization: Bearer ' . $this->apiKey
            ],
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($data),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 60
        ]);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($httpCode !== 200) {
            throw new Exception('API请求失败: ' . $response);
        }
        return json_decode($response, true);
    }
    // 保存图像到本地
    public function saveImages($result, $saveDir = 'images/') {
        if (!is_dir($saveDir)) {
            mkdir($saveDir, 0777, true);
        }
        $savedFiles = [];
        foreach ($result['artifacts'] as $index => $artifact) {
            $filename = $saveDir . 'ai_' . time() . '_' . $index . '.png';
            file_put_contents($filename, base64_decode($artifact['base64']));
            $savedFiles[] = $filename;
        }
        return $savedFiles;
    }
}
// 使用示例
$painter = new AIPainting('your-api-key-here');
try {
    $result = $painter->generateImage(
        'A beautiful sunset over mountains, digital art',
        ['width' => 1024, 'height' => 1024, 'negative_prompt' => 'blurry, low quality']
    );
    $files = $painter->saveImages($result);
    echo "图像已保存到: " . implode(', ', $files);
} catch (Exception $e) {
    echo "错误: " . $e->getMessage();
}
?>

DALL-E 3 API 示例

<?php
class DallePainting {
    private $apiKey;
    public function __construct($apiKey) {
        $this->apiKey = $apiKey;
    }
    public function generateImage($prompt, $options = []) {
        $data = [
            'model' => 'dall-e-3',
            'prompt' => $prompt,
            'n' => $options['n'] ?? 1,
            'size' => $options['size'] ?? '1024x1024',
            'quality' => $options['quality'] ?? 'standard'
        ];
        $ch = curl_init('https://api.openai.com/v1/images/generations');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_HTTPHEADER => [
                'Content-Type: application/json',
                'Authorization: Bearer ' . $this->apiKey
            ],
            CURLOPT_POSTFIELDS => json_encode($data),
            CURLOPT_TIMEOUT => 30
        ]);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if ($httpCode !== 200) {
            throw new Exception('DALL-E API错误: ' . $response);
        }
        return json_decode($response, true);
    }
}
?>

本地Stable Diffusion WebUI方案

部署本地SD WebUI

# 安装依赖
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
# 运行WebUI并开启API
python launch.py --api --listen

PHP调用本地SD WebUI API

<?php
class LocalSDPainter {
    private $baseUrl;
    public function __construct($baseUrl = 'http://127.0.0.1:7860') {
        $this->baseUrl = $baseUrl;
    }
    public function txt2img($payload) {
        $defaultPayload = [
            'prompt' => '',
            'negative_prompt' => '',
            'steps' => 20,
            'cfg_scale' => 7,
            'width' => 512,
            'height' => 512,
            'sampler_name' => 'Euler a',
            'batch_size' => 1,
            'n_iter' => 1,
        ];
        $payload = array_merge($defaultPayload, $payload);
        $ch = curl_init($this->baseUrl . '/sdapi/v1/txt2img');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_POSTFIELDS => json_encode($payload),
            CURLOPT_TIMEOUT => 120
        ]);
        $response = curl_exec($ch);
        curl_close($ch);
        return json_decode($response, true);
    }
    public function img2img($initImage, $payload) {
        $defaultPayload = [
            'prompt' => '',
            'negative_prompt' => '',
            'steps' => 20,
            'denoising_strength' => 0.7,
        ];
        $payload = array_merge($defaultPayload, $payload);
        $payload['init_images'] = [$initImage];
        $ch = curl_init($this->baseUrl . '/sdapi/v1/img2img');
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_POSTFIELDS => json_encode($payload),
            CURLOPT_TIMEOUT => 120
        ]);
        $response = curl_exec($ch);
        curl_close($ch);
        return json_decode($response, true);
    }
}
// 使用示例
$painter = new LocalSDPainter();
// 文生图
$result = $painter->txt2img([
    'prompt' => 'a beautiful landscape painting',
    'negative_prompt' => 'ugly, blurry',
    'width' => 768,
    'height' => 512
]);
// 保存生成的图片
foreach ($result['images'] as $index => $image) {
    $filename = 'sd_output_' . time() . '_' . $index . '.png';
    file_put_contents($filename, base64_decode($image));
}
?>

完整Web应用示例

简单的AI绘画网站

<?php
// ai_painting.php
session_start();
require_once 'AIPainting.php';
$message = '';
$images = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $prompt = $_POST['prompt'] ?? '';
    $apiKey = $_POST['api_key'] ?? '';
    if (!empty($prompt) && !empty($apiKey)) {
        try {
            $painter = new AIPainting($apiKey);
            $result = $painter->generateImage($prompt, [
                'width' => (int)($_POST['width'] ?? 512),
                'height' => (int)($_POST['height'] ?? 512),
                'negative_prompt' => $_POST['negative_prompt'] ?? ''
            ]);
            $images = $painter->saveImages($result);
            $message = '✅ 图像生成成功!';
        } catch (Exception $e) {
            $message = '❌ 错误: ' . $e->getMessage();
        }
    } else {
        $message = '⚠️ 请填写提示词和API Key';
    }
}
?>
<!DOCTYPE html>
<html>
<head>AI绘画工具</title>
    <style>
        body { font-family: Arial; max-width: 1200px; margin: 0 auto; padding: 20px; }
        .container { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
        .form-group { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input, textarea, select { width: 100%; padding: 8px; }
        button { background: #007bff; color: white; border: none; padding: 10px 20px; cursor: pointer; }
        .gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; }
        .gallery img { width: 100%; height: auto; border-radius: 5px; }
        .message { padding: 10px; margin: 10px 0; border-radius: 5px; }
    </style>
</head>
<body>
    <h1>🎨 AI绘画生成器</h1>
    <?php if ($message): ?>
        <div class="message"><?= $message ?></div>
    <?php endif; ?>
    <div class="container">
        <div>
            <form method="POST">
                <div class="form-group">
                    <label>API Key</label>
                    <input type="password" name="api_key" required placeholder="输入你的API Key">
                </div>
                <div class="form-group">
                    <label>提示词 (Prompt)</label>
                    <textarea name="prompt" rows="3" required placeholder="描述你想生成的图像..."><?= $_POST['prompt'] ?? '' ?></textarea>
                </div>
                <div class="form-group">
                    <label>负面提示词 (Negative Prompt)</label>
                    <textarea name="negative_prompt" rows="2" placeholder="不想出现的元素..."><?= $_POST['negative_prompt'] ?? '' ?></textarea>
                </div>
                <div class="form-group">
                    <label>尺寸</label>
                    <select name="width">
                        <option value="512">512x512</option>
                        <option value="768">768x768</option>
                        <option value="1024">1024x1024</option>
                    </select>
                </div>
                <button type="submit">✨ 生成图像</button>
            </form>
        </div>
        <div>
            <h3>生成的图像</h3>
            <div class="gallery">
                <?php foreach ($images as $image): ?>
                    <div>
                        <img src="<?= $image ?>" alt="AI生成图像">
                        <a href="<?= $image ?>" download>下载</a>
                    </div>
                <?php endforeach; ?>
            </div>
        </div>
    </div>
</body>
</html>

使用Composer包

composer require openai-php/client
<?php
require_once 'vendor/autoload.php';
use OpenAI\Client;
$yourApiKey = 'your-api-key';
$client = OpenAI::client($yourApiKey);
$result = $client->images()->create([
    'model' => 'dall-e-3',
    'prompt' => 'A cute baby sea otter',
    'n' => 1,
    'size' => '1024x1024',
    'response_format' => 'url',
]);
foreach ($result->data as $data) {
    // 下载图像
    $imageContent = file_get_contents($data->url);
    file_put_contents('otter_' . time() . '.png', $imageContent);
}
?>

推荐的最佳实践

  1. 缓存机制:缓存生成的图像,避免重复调用API
  2. 队列系统:使用Redis或数据库实现任务队列
  3. 错误处理:完善的异常捕获和日志记录
  4. 限流保护:防止API滥用
  5. 图像处理:集成GD库或Imagick进行后处理

常见API提供商

  • Stability AI:Stable Diffusion API
  • OpenAI:DALL-E 3 API
  • Replicate:多种AI模型
  • Hugging Face:开源模型API
  • 百度文心一言:国内可用的AI绘画

选择哪个方案取决于你的具体需求、预算和技术栈,建议从简单的API调用开始,逐步扩展到更复杂的方案。

抱歉,评论功能暂时关闭!