PHP selecting images with specific width and building a grid - php

I'm having trouble with building a dynamic grid with PHP like this:
I have an array containing images in various sizes, but always either 900 or 1800 in width.
Looks like this:
$images = array('img_1_900.jpg', 'img_2_900.jpg', 'img_3_1800.jpg', 'and so on');
Is there any smart way to do this? I'm kind of new to the PHP-thing, so any hints could be nice. Here's what i got so far:
$img_count = count($images);
$i = 1;
while($i <= $img_count){
list($width) = getimagesize($images[$i]);
if($width = 1800){
}
$i++;
}
I know this does nothing, but i simply don't know where to go from here. Hope some kind soul could help me a little along. I can't just float them, because they need to stay on line even after a resize, so some kind of table/table-div has to do it. I guess.
Thanks in advance!

if your image array is allway build in the same way... and not getting sorted...
$i = 0;
$html = "<table cellpadding='0' cellspacing='10' border=1>"
foreach($image as $img){
if($i == 0)
$html .= "<tr>";
if($i < 2){
$html .= "<td><img src='{$img}' /></td>";
$i++;
}
if($i == 2){
$html .= "</tr><tr>";
$html .= "<td colspan=2><img src='{$img}' /></td>";
$i = 0;
}
}
echo $html;

I can't write full functional code for you but I'll write pseudo code
H_MARGIN = // horizontal margin between elements
V_MARGIN = // vertical margin
I_HEIGHT = // Image height
$ImgWidth = 1800 + H_MARGIN
$I1800 = // Number of 1800 images
$I900 = // Number of 900 images
$NRows = $I1800 + ceil($I900 /2);
$ImgHeight = $NRows * I_HEIGHT + V_MARGIN * ($NRows - 1);
- Create $ImgWidth*$ImgHeight image
*- Blit 900 image then v_margin
- If still a 900 blit next to the first
- Else blit a 1800 then h_margin
- While images left loop back to *

Related

Creating image grid using PHP

I have a problem about PHP coding. I manage to display the first 12 image nicely on the image grid but after that, the picture seems to be out of place.
<?php
$i = 0;
while ($row = mysqli_fetch_array($result)) {
if ($i % 3 == 0) {
echo "<div class='w3-quarter'>";
}
echo "<img src='images/{$row['image']}' onclick=onClick(this) style='width:100%'>";
if ($i % 3 == 2) {
echo"</div>";
}
$i++;
}
?>
I want the output to look like this
2
and the css i using is w3-quarter from w3.css

php ProgressBar class displaying only 99% of completed jobs

I am using the ProgressBar class from the following link for displaying a progress bar for image downloads..
http://pastebin.com/KSxjC01r
I am using the following code..
echo 'Starting Image Download...<br />';
$p = new ProgressBar();
echo '<div style="width: 300px;">';
$p->render();
echo '</div>';
//progress bar
for ($i = 0; $i < ($size = 100); $i++) {
$p->setProgressBarProgress($i*100/$size);
usleep(1000000*0.01);
}
fetch_image("$item", "../cbimages/$img ");
echo "Downloaded $img <br />";
}
echo "Finished downloading images....";
Everything is working fine..But for each download it is displaying only 99.0% in progress bar. After completion too it displays as 99.0% . What is wrong the code above. Where am i going wrong. Help requested..
Update:
Resolved the issue by changing the following line in the class file:
From:
if ($percentDone == 100) {
print('document.getElementById("'.$this->pbid.'").style.display = "none";');
}
To:
if ($percentDone == 100) {
print('document.getElementById("'.$this->pbid.'").style.width = "'.$percentDone.'%";');
Your for loop currently only counts to 99 because you used < instead of <=.
Changing it to this should work:
<?php
for ($i = 0; $i <= ($size = 100); $i++) {
$p->setProgressBarProgress($i * 100 / $size);
usleep(1000000 * 0.01);
}
Your loop isn't quite right
you have this:
for ($i = 0; $i < ($size = 100); $i++) {
The rule is that i < 100 so, when i == 100 the loop is not run. Meaning it is never passed to setProgressBarProgress()
This will work:
for ($i = 0; $i <= ($size = 100); $i++) {
The loop will still run when i == 100

How can I stop certain part of my php script from executing? (to make my page load faster)

<?php
$rows_per_page = 2;
$cols_per_page = 2;
$image_href = '<a href=/';
$image_links = array('file1/page1>', 'file2/page2>', 'file3/page3>',
'file4/page4>', 'file5/page5>', 'file6/page6>', 'file6/page6>',
'file/page7>', 'file/page8>', 'subfile/page9>');
$img_srcs = '<img src="https://s3.amazonaws.com/imagetitle/';
$images = array();
for($i = 1; $i < 10; $i++)
{
$images[$i] = $i;
}
$image_ending = '.png" height="200" width="200" /></a>';
$image_descriptions = array('<br />something', '<br />description',
'<br />arbitrary', 'random', '<br />you', '<br />get', '<br />the',
'<br />idea', '<br />itsdescriptions');
$total_images = count($images);
$images_per_page = $rows_per_page * $cols_per_page;
$total_images = count($images);
$total_pages = ceil($total_images / $images_per_page);
$current_page = (int) $_GET['page'];
if($current_page<1 || $current_page>$total_pages)
{
$current_page = 1;
}
//Get records for the current page
$page_image_links = array_splice($image_links, ($current_page-1)*$images_per_page, $images_per_page);
$page_images = array_splice($images, ($current_page-1)*$images_per_page, $images_per_page);
$page_image_descriptions = array_splice($image_descriptions, ($current_page-1)*$images_per_page, $images_per_page);
$slots = "<table border=\"1\">";
for($row=0; $row<$rows_per_page; $row++)
{
$slots .= "<tr>";
for($col=0; $col<$cols_per_page; $col++)
{
$imgIdx = ($row * $rows_per_page) + $col;
$img = (isset($page_images[$imgIdx])) ? "{$image_href}{$page_image_links[$imgIdx]}{$img_srcs}{$page_images[$imgIdx]}{$image_ending}{$page_image_descriptions[$imgIdx]}" : ' ';
$slots .= "<td>$img</td>";
}
$slots .= "</tr>";
}
$slots .= "</table>";
//Create pagination links
$first = "First";
$prev = "Prev";
$next = "Next";
$last = "Last";
if($current_page>1)
{
$prevPage = $current_page - 1;
$first = "First";
$prev = "Prev";
}
if($current_page<$total_pages)
{
$nextPage = $current_page + 1;
$next = "Next";
$last = "Last";
}
?>
<html>
<title></title>
<body>
<h2>Here are the records for page <?php echo $current_page; ?></h2>
<ul>
<?php echo $slots; ?>
</ul>
Page <?php echo $current_page; ?> of <?php echo $total_pages; ?>
<br />
<?php echo "{$first} | {$prev} | {$next} | {$last}"; ?>
</body>
</html>
So basically this code above makes it easy to put up images and their links. For now, I don't have that many images, so the page runs super fast. However, I'm thinking in the long run. If I have say, 10,000 images, it's gonna take a long time to process each paginated page, as I would have $image_links of file1/page1 up to file10000/page10000, and 10000 descriptions! Is there a way to stop the web browser from reading, or skip, certain parts of the script (the $image_links and $image_descriptions in my case)? That way, it won't need to read through all 10000 $image_links and $image_descriptions.
Thanks!
I'm going to suggest another approach. Using arrays for this is not ideal; it really feels like it should be a database driven app.
If you decide to go for that approach, pagination becomes much easier. You can just ask your database engine for the corresponding records. For example, in MySQL, you'd ask for the data something like this:
select * from tableA order by id limit 10 offset 20;
This would return id's 21 thru 30.
... and, would scale much better. Of course, if you've never done any work with databases, there is quite a learning curve.
If you want to end execution at a certain place, just call exit;
Try using the onload function on your < body >'s html, so it will load the page at once

Dynamically including multiple files within php for image descriptions

Working on implementing image descriptions to a php run gallery and can't seem to figure out how to call each text file for each individual image. I would need to place a div in the code for the image and then call the include.
//total number of images
$total = 77;
//max number of thumbnails per page
$max = 9;
//what image do we want to start from?
$startcount = $_GET["start"];
//if there is not a defined starting image, we start with the first
if(empty($startcount))
{
$startcount = 0;
}
//start off the loop at 1
$loop = 1;
//start the loop
while($loop <= $max)
{
//for the picture labels
$num = $startcount + $loop;
if($num > $total)
{
$num = $num - 1;
break;
}
// Add class="last" to every third list item
if(is_int($num / 3))
{
$last = ' class="last"';
}
else
{
$last = "";
}
//the code for the image
echo '
<li'.$last.'><img src="images/portfolio/thumbs/pic-'.$num.'-thumb.jpg" width="256" height="138" alt="Thumbnail of image '.$num.'" /><div>'.$num.'</div></li>';
I see that I can call the text files by number using '.$num.' (I have 77 individual text files with a phrase in each) but how do I tell it to call the files?
Assuming the description files are named something like "description_$num.txt", you can simply use readfile.
echo "<li${last}><a href='images/portfolio/pic-${num}.jpg' rel='milkbox[gall1]'>
<img src='images/portfolio/thumbs/pic-${num}-thumb.jpg' width='256'
height='138' alt='Thumbnail of image ${num}'/>
</a><div>";
readfile("description_${num}.txt");
echo '</div></li>';
Note that you don't "call" files in PHP, you either include them (which interprets them as scripts) or read them (which dumps them to the output).
For each file you need to do something like that:
<?php
$f=fopen($file,'r');
$data='';
while(!feof($f))
$data.=fread($f,$size);
fclose($f);
// do whatever you want with the file content.
?>
I made use of file_get_contents, and split the output a bit so you can more easily modify it:
<?php
$total = 77;
$max = 9;
$startcount = $_GET["start"];
$loop = 1;
if(empty($startcount)) $startcount = 0;
while($loop <= $max)
{
$num = $startcount + $loop;
if($num > $total)
{
$num--;
break;
}
$last = ($num % 3 == 0 ? ' class="last"' : '');
$output = "<li $last>";
$output .= "<a href=\"images/portfolio/pic-$num.jpg\" rel=\"milkbox[gall1]\">";
$output .= "<img src=\"images/portfolio/thumbs/pic-$num-thumb.jpg\" width=\"256\" height=\"138\" alt=\"Thumbnail of image $num\">";
$output .= "</a>";
$output .= "<div>";
$output .= file_get_contents("textfile-" . $num . ".txt"); // assuming this is where you want the phrase
$output .= "</div>";
$output .= "</li>";
echo $output;
}
?>

Adding description tag to PHP image gallery

I am trying add a descriptive tag under each image but most of the code is in PHP and i am not to familiar with how to program it without screwing up the whole structure. Here is the website: http://suncoastdeck.com/index.php?page=portfolio&start=0
Here is the code for the portfolio page:
<div class="content-box">
<?
//total number of images
$total = 77;
//max number of thumbnails per page
$max = 9;
//what image do we want to start from?
$startcount = $_GET["start"];
//if there is not a defined starting image, we start with the first
if(empty($startcount))
{
$startcount = 0;
}
//start off the loop at 1
$loop = 1;
//start the loop
while($loop <= $max)
{
//for the picture labels
$num = $startcount + $loop;
if($num > $total)
{
$num = $num - 1;
break;
}
// Add class="last" to every third list item
if(is_int($num / 3))
{
$last = ' class="last"';
}
else
{
$last = "";
}
//the code for the image
echo '
<li'.$last.'><img src="images/portfolio/thumbs/pic-'.$num.'-thumb.jpg" width="256" height="138" alt="Thumbnail of image '.$num.'" /><div>'.$num.'</div></li>';
//add 1 to the loop
$loop++;
}
echo '</ul>';
//Calculate the number of pages
$total_pages = $total / $max;
//clean it up
if(!is_int($total_pages))
{
$total_pages = floor($total_pages) + 1;
}
//start the page count at 1
$ploop = 1;
echo '<hr /><div id="portfolio-wrap"><div id="pages">Page: ';
while($ploop <= $total_pages)
{
$offset = ($ploop * $max) - $max;
if($startcount == $offset)
{
echo '<span>'.$ploop.'</span>';
}
else
{
echo ''.$ploop.'';
}
$ploop++;
}
echo '</div>';
echo '<div id="portfolio-foot-left"><p>Displaying Images <strong>'.($startcount + 1).' - '.$num.'</strong> of <strong>'.$total.'</strong></p></div></div>';
?>
Pretty much what i want is to make section drop down a bit more where i can add in additional info about the pic. Any suggestions?
You need a database or else you can store your descriptions in a text file next to the image. What have you tried so far?
Basically you need to create a form that accepts the image name and caption, take the caption and write it to a file or database. Then when displaying the caption, you just add a <div> that reads from file with file_get_contents(). Why don't you copy the script to another directory and start experimenting? People probably won't write the whole thing for you ;)

Categories