Hợp nhất hai hình ảnh với PHP


76

Tôi đang cố gắng hợp nhất hai hình ảnh với nhau bằng PHP.

Ví dụ ... tôi sẽ làm thế nào về việc đặt hình ảnh một lên trên hình ảnh hai hoặc hợp nhất, với PHP cơ bản? Tôi đã thử một cái gì đó chẳng hạn như watermarking, nhưng nó dường như không hoạt động.

Hình ảnh Một

văn bản thay thế

Hình ảnh hai

văn bản thay thế

... và nó có biến thành thế này không? KẾT QUẢ CUỐI CÙNG:

văn bản thay thế


1
chỉ hiển thị hoặc yu cố gắng để tạo ra hình ảnh
zod

Nếu watermark đang hoạt động, nhưng không mang lại kết quả như bạn mong muốn, đầu óc quanh co của tôi đang nghĩ về việc kết hợp 3 hình ảnh. hình ảnh đầu tiên là một hình ảnh trống màu trắng, u hợp nhất hình ảnh đầu tiên ở bên trái và hình ảnh thứ hai ở bên phải. Tôi biết viết mã sẽ không dễ dàng như đăng bình luận. Bình luận chỉ là những gì cam Ein tâm trí của tôi
zod

1
bạn có chắc bạn cần php? bạn có thể dễ dàng css it
warfish

Tôi cần PHP nếu tôi cho phép người dùng tải xuống hình ảnh.
bài tập về nhà

@Homework Bạn đã có câu trả lời bên dưới. Nhưng chỉ để biết thông tin: Bạn có thể kết hợp hình ảnh (và làm nhiều thứ khác nữa) thông qua JavaScript và <canvas>phần tử. Hình ảnh kết xuất cũng có thể được tải xuống bởi người dùng như bạn đã nói.
StanE

Câu trả lời:


121

Tôi đã làm cho nó hoạt động từ một cái tôi đã làm.

<?php
$dest = imagecreatefrompng('vinyl.png');
$src = imagecreatefromjpeg('cover2.jpg');

imagealphablending($dest, false);
imagesavealpha($dest, true);

imagecopymerge($dest, $src, 10, 9, 0, 0, 181, 180, 100); //have to play with these numbers for it to work for you, etc.

header('Content-Type: image/png');
imagepng($dest);

imagedestroy($dest);
imagedestroy($src);
?>

4
Hoạt động trên hình ảnh với độ trong suốt.
bài tập về nhà

25

Câu hỏi là về việc hợp nhất hai hình ảnh, tuy nhiên trong trường hợp cụ thể này, bạn không nên làm điều đó. Bạn nên đặt Hình ảnh nội dung (tức là. Bìa) vào <img />thẻ và Hình ảnh phong cách vào CSS, tại sao?

  1. Như tôi đã nói bìa thuộc về nội dung của tài liệu, trong khi bản ghi vinyl và bóng chỉ là một phần của các kiểu trang.
  2. Việc phân tách như vậy sẽ tiện lợi hơn rất nhiều khi sử dụng. Người dùng có thể dễ dàng sao chép hình ảnh đó. Dễ dàng lập chỉ mục bằng trình thu thập dữ liệu web.
  3. Cuối cùng, nó dễ bảo trì hơn nhiều.

Vì vậy, hãy sử dụng một mã rất đơn giản:

<div class="cover">
   <img src="/content/images/covers/movin-mountains.png" alt="Moving mountains by Pneuma" width="100" height="100" />
</div>

.cover {
    padding: 10px;
    padding-right: 100px;

    background: url(/style/images/cover-background.png) no-repeat;
}

3
Cảm ơn vì điều này, nhưng tôi đã yêu cầu PHP. Vẫn sẽ lưu điều này.
bài tập về nhà

1
Thật. Nó dễ dàng hơn cho máy chủ vì nó không phải xử lý tất cả các hình ảnh. Và nó cũng nhanh hơn cho người dùng vì nó không có phần hình ảnh với vinyl mọi lúc.
Nicky Smits

2
Câu trả lời được chọn là thú vị vì chúng ta có thể trộn hai hình ảnh và chia sẻ trên facebook.
Fabio Montefuscolo,

2
CSS chỉ hoạt động nếu hình ảnh được sử dụng trên một trang web. Không thể tạo hình ảnh được chia sẻ trên mạng xã hội, do người dùng tải xuống, v.v. bằng CSS.
Chuyến bay Sherwin

Một số có thể giúp tôi Tôi cần lưu hình ảnh sau khi hợp nhất. Điều này có thể bằng cách viết html.
Rahul Vats

11

ImageArtist là một trình bao bọc gd thuần túy do tôi sáng tác, điều này cho phép bạn thực hiện các thao tác hình ảnh phức tạp cực kỳ dễ dàng, vì giải pháp câu hỏi của bạn có thể được thực hiện bằng rất ít bước sử dụng thư viện mạnh mẽ này.

đây là một mã mẫu.

$img1 = new Image("./cover.jpg");
$img2 = new Image("./box.png");
$img2->merge($img1,9,9);
$img2->save("./merged.png",IMAGETYPE_PNG);

Đây là kết quả của tôi trông như thế nào.

nhập mô tả hình ảnh ở đây


Tuyệt vời! Cảm ơn bạn.
bài tập về nhà

Tuyệt diệu! bạn tiết kiệm cho tôi giờ!
Atomico

4

Bạn có thể thử chức năng của tôi để hợp nhất hình ảnh theo chiều ngang hoặc chiều dọc mà không thay đổi tỷ lệ hình ảnh. chỉ cần sao chép dán sẽ hoạt động.

function merge($filename_x, $filename_y, $filename_result, $mergeType = 0) {

    //$mergeType 0 for horizandal merge 1 for vertical merge

 // Get dimensions for specified images
 list($width_x, $height_x) = getimagesize($filename_x);
 list($width_y, $height_y) = getimagesize($filename_y);


$lowerFileName = strtolower($filename_x); 
if(substr_count($lowerFileName, '.jpg')>0 || substr_count($lowerFileName, '.jpeg')>0){
    $image_x = imagecreatefromjpeg($filename_x);    
}else if(substr_count($lowerFileName, '.png')>0){
    $image_x = imagecreatefrompng($filename_x); 
}else if(substr_count($lowerFileName, '.gif')>0){
    $image_x = imagecreatefromgif($filename_x); 
}


$lowerFileName = strtolower($filename_y); 
if(substr_count($lowerFileName, '.jpg')>0 || substr_count($lowerFileName, '.jpeg')>0){
    $image_y = imagecreatefromjpeg($filename_y);    
}else if(substr_count($lowerFileName, '.png')>0){
    $image_y = imagecreatefrompng($filename_y); 
}else if(substr_count($lowerFileName, '.gif')>0){
    $image_y = imagecreatefromgif($filename_y); 
}


if($mergeType==0){
    //for horizandal merge
     if($height_y<$height_x){
        $new_height = $height_y;

        $new_x_height = $new_height;
        $precentageReduced = ($height_x - $new_height)/($height_x/100);
        $new_x_width = ceil($width_x - (($width_x/100) * $precentageReduced));

         $tmp = imagecreatetruecolor($new_x_width, $new_x_height);
        imagecopyresampled($tmp, $image_x, 0, 0, 0, 0, $new_x_width, $new_x_height, $width_x, $height_x);
        $image_x = $tmp;

        $height_x = $new_x_height;
        $width_x = $new_x_width;

     }else{
        $new_height = $height_x;

        $new_y_height = $new_height;
        $precentageReduced = ($height_y - $new_height)/($height_y/100);
        $new_y_width = ceil($width_y - (($width_y/100) * $precentageReduced));

         $tmp = imagecreatetruecolor($new_y_width, $new_y_height);
        imagecopyresampled($tmp, $image_y, 0, 0, 0, 0, $new_y_width, $new_y_height, $width_y, $height_y);
        $image_y = $tmp;

        $height_y = $new_y_height;
        $width_y = $new_y_width;

     }

     $new_width = $width_x + $width_y;

     $image = imagecreatetruecolor($new_width, $new_height);

    imagecopy($image, $image_x, 0, 0, 0, 0, $width_x, $height_x);
    imagecopy($image, $image_y, $width_x, 0, 0, 0, $width_y, $height_y);

}else{


    //for verical merge
    if($width_y<$width_x){
        $new_width = $width_y;

        $new_x_width = $new_width;
        $precentageReduced = ($width_x - $new_width)/($width_x/100);
        $new_x_height = ceil($height_x - (($height_x/100) * $precentageReduced));

        $tmp = imagecreatetruecolor($new_x_width, $new_x_height);
        imagecopyresampled($tmp, $image_x, 0, 0, 0, 0, $new_x_width, $new_x_height, $width_x, $height_x);
        $image_x = $tmp;

        $width_x = $new_x_width;
        $height_x = $new_x_height;

     }else{
        $new_width = $width_x;

        $new_y_width = $new_width;
        $precentageReduced = ($width_y - $new_width)/($width_y/100);
        $new_y_height = ceil($height_y - (($height_y/100) * $precentageReduced));

         $tmp = imagecreatetruecolor($new_y_width, $new_y_height);
        imagecopyresampled($tmp, $image_y, 0, 0, 0, 0, $new_y_width, $new_y_height, $width_y, $height_y);
        $image_y = $tmp;

        $width_y = $new_y_width;
        $height_y = $new_y_height;

     }

     $new_height = $height_x + $height_y;

     $image = imagecreatetruecolor($new_width, $new_height);

    imagecopy($image, $image_x, 0, 0, 0, 0, $width_x, $height_x);
    imagecopy($image, $image_y, 0, $height_x, 0, 0, $width_y, $height_y);

}





$lowerFileName = strtolower($filename_result); 
if(substr_count($lowerFileName, '.jpg')>0 || substr_count($lowerFileName, '.jpeg')>0){
    imagejpeg($image, $filename_result);
}else if(substr_count($lowerFileName, '.png')>0){
    imagepng($image, $filename_result);
}else if(substr_count($lowerFileName, '.gif')>0){
    imagegif($image, $filename_result); 
}


 // Clean up
 imagedestroy($image);
 imagedestroy($image_x);
 imagedestroy($image_y);

}


merge('images/h_large.jpg', 'images/v_large.jpg', 'images/merged_har.jpg',0); //merge horizontally
merge('images/h_large.jpg', 'images/v_large.jpg', 'images/merged.jpg',1); //merge vertically

2

Sử dụng thư viện GD hoặc ImageMagick. Tôi đã tìm kiếm 'hình ảnh hợp nhất GD PHP' và nhận được một số bài viết về việc này. Trước đây, những gì tôi đã làm là tạo một hình ảnh trống lớn, và sau đó sử dụng imagesecopymerge () để dán những hình ảnh đó vào hình trống ban đầu của tôi. Kiểm tra các bài viết trên google bạn sẽ tìm thấy một số mã nguồn mà bạn có thể bắt đầu sử dụng ngay lập tức.


1

Bạn có thể làm điều này với tiện ích mở rộng ImageMagick . Tôi đoán rằng phương thức connectImages () sẽ làm những gì bạn muốn.


1

Thư viện thao tác hình ảnh GD trong PHP có lẽ là tốt nhất để làm việc với hình ảnh trong PHP. Hãy thử một trong các chức năng sao chép hình ảnh (hình ảnh, mô hình ảo, ...). Mỗi người trong số họ kết hợp 2 hình ảnh theo những cách khác nhau. Xem tài liệu php về hình ảnh để biết thêm thông tin.


0

Hợp nhất hai hình ảnh png và jpg / png [Image Masking]

//URL or Local path
$src_url = '1.png';
$dest_url = '2.jpg';
$src = imagecreatefrompng($src_url);
$dest1 = imagecreatefromjpeg($dest_url);

//if you want to make same size
list($width, $height) = getimagesize($dest_url);
list($newWidth, $newHeight) = getimagesize($src_url);
$dest = imagecreatetruecolor($newWidth, $newHeight);

imagecopyresampled($dest, $dest1, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

list($src_w, $src_h) = getimagesize($src_url);

//merger with same size
$this->imagecopymerge_alpha($dest, $src, 0, 0, 0, 0, $src_w, $src_h, 100);

//show output on browser
header('Content-Type: image/png');
imagejpeg($dest);

imageecopymerge_alpha

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
    {
        $cut = imagecreatetruecolor($src_w, $src_h);
        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.