Avatar of Pedro Chagas
Pedro Chagas
Flag for Portugal asked on

Transform the photo into pieces (squares or rectangles)

Hi E's, I try to found the best solution, not matter if it is in imagemagick or in php, for get equal pieces of a picture like you can see in attach image.
In practice, if I have a picture width 800 * length 600, and if I want 12 pieces 4*3 (view attach image), I will get 12 pieces of 200*200 each one:
I will use get_image_size to know the size of the picture.
(variables width and length come from the get_image_size array)
$width = $width / 4; //determinate the width, it is 200px
$length = $length / 3 //determinate the length, it is 200px
Now it is the difficult part, it is give me 12 pieces 200*200 each and save in one folder of my server.

How I get the pieces of picture?

Regards, JC
pieces.png
Web Languages and StandardsPHP

Avatar of undefined
Last Comment
Marco Gasi

8/22/2022 - Mon
existenz2

ASKER CERTIFIED SOLUTION
Marco Gasi

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Pedro Chagas

ASKER
Hi @marqusG, I try your code and don't work fine.
The system create the image 1 to 12, but when I open the pieces, the pieces contain nothing! The size of each piece is about 1kb.
What is the problem?

Regards, JC
Marco Gasi

Hi, joaochagas. Have you tried my snippet as is using image attached? In my system (Windows 7) all 12 files are created, they have size of 2.68 Kb and contains the expected portion of image.I post the screenshot of my thumbnails viewed in Explorer.
If you have tried my code with your image, maybe something goes wrong with your image... How you get image?
Maybe you can post the code wich grabs your image to see if there is something wrong in it.

2010-09-10-201450.jpg
All of life is about relationships, and EE has made a viirtual community a real community. It lifts everyone's boat
William Peck
Pedro Chagas

ASKER
Hi, I post the code and attach the image I use to do the thumbs.

Regards, JC
error_reporting(E_ALL);
$src = imagecreatefromjpeg('for_puzzle.jpg');
$dest = imagecreatetruecolor(200,200);
$w=460;
$h=345;
$c = 0;
for ($y = 0; $y < 3; $y++) {
    for ($x = 0; $x < 4; $x++) {
        $c++;
        imagecopy($dest, $src, 0, 0, $w*$x, $h*$y, $w, $h);
        imagejpeg($dest, $c.'.jpg', 100);
    }
}
imagedestroy($dest);
imagedestroy($src);
?>

Open in new window

for-puzzle.jpg
Marco Gasi

In your question you said to " have a picture width 800 * length 600" but now the picture has a different dimension, so there are three cases:
1 - you resize image to obtain a picture 800x600;
2 - you change accordingly the piece's size : 460/4=115, 345/3=115
3 - you decrease the number of pieces (if picture size allows it: 460/200=2.3 so in this case you can't choose this third alternative).

Besides, in your script you set $w and $h to the picture's sizes but this is wrong. If you look at my original code, $w and $h was set to piece's size, that is 200.

At the end, if you want to use for-puzzle.jpg use attached code.

Best
<?php
error_reporting(E_ALL);
$src = imagecreatefromjpeg('for-puzzle.jpg');
$dest = imagecreatetruecolor(115,115);
$w=115;
$h=115;
$c = 0;
for ($y = 0; $y < 3; $y++) {
    for ($x = 0; $x < 4; $x++) {
        $c++;
//        echo $w*$x.",  " .$h*$x. "<br>";
        imagecopy($dest, $src, 0, 0, $w*$x, $h*$y, $w, $h);
        imagejpeg($dest, $c.'.jpg', 100);
    }
}
imagedestroy($dest);
imagedestroy($src);
?>

Open in new window

Pedro Chagas

ASKER
Hi, with 800*600 picture work well.
Why don't work with my picture 460*345?
I change $w and $h to 115!!!
I don't have always pictures with 800*600, I can have other formats!

Regards, JC
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Marco Gasi

because, I'm sure, you forgot to change this line

$dest = imagecreatetruecolor(200,200);

this way

$dest = imagecreatetruecolor(115,115);