<?php
// speech_bubble_overlays.php
// RJM Programming
// October, 2025
// ImageMagick extraction of macOS Preview helping Paintbrush PNG image Speech Bubble content as overlaying background images onto a base image
// As asked for a new overlay image can be created via PHP exec ImageMagick calls
// Thanks to https://github.com/ImageMagick/ImageMagick/discussions/4606 and https://stackoverflow.com/questions/71094480/how-to-execute-multi-line-command-with-shell-exec

$cmd="";
$newcmd="";
$baseimage='./luna_upstairs.jpg';
$overlayimage='./luna_backagain.png';
$exceptthat="";

function somenot($theta) {
  $wds=explode(' ', $theta);
  if (sizeof($wds) > 3) {
    $newta=str_replace($wds[0] . ' ' . $wds[1] . ' ', ' ', $theta);
    return substr($newta, 0, (strlen($newta) - 1 - strlen($wds[-1 + sizeof($wds)])));
  }
  return $theta;
}


if (isset($_GET['baseimage']) && isset($_GET['overlayimage'])) {
  unlink(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png');
  $baseimage=str_replace('+',' ',urldecode($_GET['baseimage']));
  $overlayimage=str_replace('//','/',str_replace('./','/',dirname(__FILE__) . DIRECTORY_SEPARATOR . str_replace('+',' ',urldecode($_GET['overlayimage']))));
  $ouroverlayimage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png';
  
  // Thanks to https://github.com/ImageMagick/ImageMagick/discussions/4606 and https://stackoverflow.com/questions/71094480/how-to-execute-multi-line-command-with-shell-exec
  $cmd = <<<CMD
/bin/convert luna_backagain-1.jpeg -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
luna_backagain.png
CMD;

  if (isset($_GET['myinnards'])) {
  $partc = <<<CMD
 -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
CMD;
  $cmd=str_replace("\n\n"," ",str_replace($partc, str_replace('+',' ',urldecode($_GET['myinnards'])), $cmd));
  $newcmd=$cmd;
  } else if (isset($_POST['myinnards'])) {
  $partc = <<<CMD
 -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
CMD;
  $cmd=str_replace("\n\n"," ",str_replace($partc, str_replace('+',' ',urldecode($_GET['myinnards'])), $cmd));
  $newcmd=$cmd;
  }

  $sx="/bin/convert";
  if (file_exists('/usr/local/bin/convert')) {
    $sx="/usr/local/bin/convert";
  }
  $cmd=str_replace("/bin/convert", "" . $sx, str_replace(" luna_backagain-1.jpeg", " " . $overlayimage . "", str_replace("luna_backagain.png", "" . $ouroverlayimage . " 2> " . dirname(__FILE__) . DIRECTORY_SEPARATOR . "luna.bad", $cmd)));

  $sx=shell_exec($cmd); //" /bin/convert " . $overlayimage . " " . $sw . " -alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite " . $ouroverlayimage . " 2> luna.bad > luna.ok");
  if (!file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png')) {
  $exceptthat="<font color=red> ... but errors above cause the fallback you see above</font>";
  file_put_contents('xx.xx', $sx);
  $derivedvia="&nbsp;a&nbsp;Preview&nbsp;inspired&nbsp;Speech&nbsp;Bubble&nbsp;extracted&nbsp;image&nbsp;regarding&nbsp;could&nbsp;not&nbsp;be&nbsp;created&nbsp;via&nbsp;ImageMagick&nbsp;<font color=red>(" . $sx . file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna.bad') . ")</font>&nbsp;from&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimagevia style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'></img></a>";
  $ouroverlayimage=$overlayimage;
  } else {
  $ouroverlayimage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png';
  $derivedvia="&nbsp;created&nbsp;via&nbsp;ImageMagick&nbsp;from&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimagevia style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'></img></a>";
  }
} else if (isset($_POST['baseimage']) && isset($_POST['overlayimage'])) {
  unlink(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png');
  $baseimage=str_replace('+',' ',urldecode($_POST['baseimage']));
  $overlayimage=str_replace('//','/',str_replace('./','/',dirname(__FILE__) . DIRECTORY_SEPARATOR . str_replace('+',' ',urldecode($_POST['overlayimage']))));
  $ouroverlayimage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png';
  
  // Thanks to https://github.com/ImageMagick/ImageMagick/discussions/4606 and https://stackoverflow.com/questions/71094480/how-to-execute-multi-line-command-with-shell-exec
  $cmd = <<<CMD
/bin/convert luna_backagain-1.jpeg -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
luna_backagain.png
CMD;

  if (isset($_GET['myinnards'])) {
  $partc = <<<CMD
 -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
CMD;
  $cmd=str_replace("\n\n"," ",str_replace($partc, str_replace('+',' ',urldecode($_GET['myinnards'])), $cmd));
  $newcmd=$cmd;
  } else if (isset($_POST['myinnards'])) {
  $partc = <<<CMD
 -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
CMD;
  $cmd=str_replace("\n\n"," ",str_replace($partc, str_replace('+',' ',urldecode($_GET['myinnards'])), $cmd));
  $newcmd=$cmd;
  }

  $sx="/bin/convert";
  if (file_exists('/usr/local/bin/convert')) {
    $sx="/usr/local/bin/convert";
  }
  $cmd=str_replace("/bin/convert", "" . $sx, str_replace(" luna_backagain-1.jpeg", " " . $overlayimage . "", str_replace("luna_backagain.png", "" . $ouroverlayimage . " 2> " . dirname(__FILE__) . DIRECTORY_SEPARATOR . "luna.bad" . "", $cmd)));

  $sx=shell_exec($cmd); //" /bin/convert " . $overlayimage . " " . $sw . " -alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite " . $ouroverlayimage . " 2> luna.bad > luna.ok");
  if (!file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png')) {
  $exceptthat="<font color=red> ... but errors above cause the fallback you see above</font>";
  $derivedvia="&nbsp;a&nbsp;Preview&nbsp;inspired&nbsp;Speech&nbsp;Bubble&nbsp;extracted&nbsp;image&nbsp;regarding&nbsp;could&nbsp;not&nbsp;be&nbsp;created&nbsp;via&nbsp;ImageMagick&nbsp;<font color=red>(" . $sx . file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna.bad') . ")</font>&nbsp;from&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimagevia style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'></img></a>";
  $ouroverlayimage=$overlayimage;
  } else {
  $ouroverlayimage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png';
  $derivedvia="&nbsp;created&nbsp;via&nbsp;ImageMagick&nbsp;from&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimagevia style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'></img></a>";
  }
} else {
  unlink(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png');
  $overlayimage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain-1.jpeg';
  $ouroverlayimage=dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png';
  
  // Thanks to https://github.com/ImageMagick/ImageMagick/discussions/4606 and https://stackoverflow.com/questions/71094480/how-to-execute-multi-line-command-with-shell-exec
  $cmd = <<<CMD
/bin/convert luna_backagain-1.jpeg -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
luna_backagain.png
CMD;

  if (isset($_GET['myinnards'])) {
  $partc = <<<CMD
 -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
CMD;
  $cmd=str_replace("\n\n"," ",str_replace($partc, str_replace('+',' ',urldecode($_GET['myinnards'])), $cmd));
  $newcmd=$cmd;
  } else if (isset($_POST['myinnards'])) {
  $partc = <<<CMD
 -alpha off \
\( -clone 0 -color-threshold "srgb(0,0,0)-srgb(0,0,0)" \) \
\( -clone 0 -color-threshold "srgb(220,220,220)-srgb(235,235,235)" \) \
\( -clone 1,2 -compose plus -composite \) \
-delete 1,2 \
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \
CMD;
  $cmd=str_replace("\n\n"," ",str_replace($partc, str_replace('+',' ',urldecode($_GET['myinnards'])), $cmd));
  $newcmd=$cmd;
  }

  $sx="/bin/convert";
  if (file_exists('/usr/local/bin/convert')) {
    $sx="/usr/local/bin/convert";
  }
  $cmd=str_replace("/bin/convert", "" . $sx, str_replace(" luna_backagain-1.jpeg", " " . $overlayimage . "", str_replace("luna_backagain.png", "" . $ouroverlayimage . " 2> " . dirname(__FILE__) . DIRECTORY_SEPARATOR . "luna.bad" . "", $cmd)));

  $sx=shell_exec($cmd); //" /bin/convert " . $overlayimage . " " . $sw . " -alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite " . $ouroverlayimage . " 2> luna.bad > luna.ok");
  //echo $sx;
  //exit;
  if (!file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna_backagain.png')) {
  $exceptthat="<font color=red> ... but errors above cause the fallback you see above</font>";
  $derivedvia="&nbsp;a&nbsp;Preview&nbsp;inspired&nbsp;Speech&nbsp;Bubble&nbsp;extracted&nbsp;image&nbsp;regarding&nbsp;could&nbsp;not&nbsp;be&nbsp;created&nbsp;via&nbsp;ImageMagick&nbsp;<font color=red>(" . $sx . file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'luna.bad') . ")</font>&nbsp;from&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimagevia style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'></img></a>";
  $ouroverlayimage=$overlayimage;
  } else {
  $derivedvia="&nbsp;created&nbsp;via&nbsp;ImageMagick&nbsp;from&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimagevia style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "?rand=" . rand(0,567876) . "'></img></a>";
  }
}

echo "<html>
<head>
<script type=text/javascript>

 function veturls() {
   if (document.getElementById('baseimage').value.trim().indexOf('.') == -1 || document.getElementById('overlayimage').value.trim().indexOf('.') == -1) {
     alert('Not image URLs.');
     return false;
   } else if (document.getElementById('overlayimage').value.trim().indexOf('//') != -1) {
     alert('Overlay images need to be relative URLs.');
     return false;
   }
   return true;
 }
 
 function dotitle() {
   var nc='" . ($newcmd == '' ? '' : 'x') . "', newta='';
   if (nc != '') { newta=document.getElementById('myinnards').outerHTML.split('>')[0] + '>';  document.getElementById('mydiv').innerHTML=newta + '" . somenot(str_replace("\n","' + String.fromCharCode(32) + '",str_replace("\r","' + String.fromCharCode(32) + '",str_replace("\r\n","' + String.fromCharCode(32) + '",str_replace("'","' + String.fromCharCode(39) + '",$newcmd))))) . "</textarea>';  }
   document.body.title=document.getElementById('myta').value;
 }

</script>
<style>
 * { margin: 0 0 0 0;
     padding: 0 0 0 0;
    }
</style>
</head>
<body onload=setTimeout(dotitle,4000); title='' style='background:URL(" . $baseimage . "?rand=" . rand(0,567876) . ");background-size:auto;background-repeat:no-repeat;background-blend-mode:difference;'>
<table><tr><td id=tdleft><div>
<img src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $ouroverlayimage) . "?rand=" . rand(0,567876) . "'></img>
</div></td><td id=tdright style=vertical-align:top;>
<h1>Preview Default Coloured <a target=_blank style='text-decoration:none;cursor:pointer;' title='ImageMagick software suite information' href='https://www.imagemagick.org/'>ImageMagick</a> Speech Bubble Extraction and Background Image Overlay</h1><br>
<h3>RJM Programming - October, 2025</h3><br>
<h4>Thanks to <a target=_blank href='//github.com/ImageMagick/ImageMagick/discussions/4606'>https://github.com/ImageMagick/ImageMagick/discussions/4606</a> and <a target=_blank href='//stackoverflow.com/questions/71094480/how-to-execute-multi-line-command-with-shell-exec'>https://stackoverflow.com/questions/71094480/how-to-execute-multi-line-command-with-shell-exec</a></h4><br><br>
<form style=font-size:24px; onsubmit='return veturls();' action='./speech_bubble_overlays.php' method=GET>
Base image URL: <input id=baseimage name=baseimage type=text value='" . $baseimage . "'></input>&nbsp;<a download='" . basename($baseimage) . "' href='" . $baseimage . "?rand=" . rand(0,567876) . "'><img id=imgbaseimage style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . $baseimage . "?rand=" . rand(0,567876) . "'></img></a></br>
Overlay image URL: <input id=overlayimage name=overlayimage type=text value='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $overlayimage) . "'></input>&nbsp;<a download='" . basename(str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $ouroverlayimage)) . "' href='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $ouroverlayimage) . "?rand=" . rand(0,567876) . "'><img id=imgoverlayimage style='border:2px dotted yellow;display:inline-block;width:160px;' src='" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, './', $ouroverlayimage) . "?rand=" . rand(0,567876) . "'></img></a>" . $derivedvia . "</br><br>
ImageMagick Switches <font size=1>(acting on last image above to create middle image above" . $exceptthat . ")</font> ... <br>
<div id=mydiv><textarea style=width:70%;height:150px;background-color:rgb(230,230,230); onblur='this.name=this.id;' onchange='this.name=this.id;' id=myinnards> -alpha off \\
\\( -clone 0 -color-threshold \"srgb(0,0,0)-srgb(0,0,0)\" \\) \\
\\( -clone 0 -color-threshold \"srgb(220,220,220)-srgb(235,235,235)\" \\) \\
\\( -clone 1,2 -compose plus -composite \\) \\
-delete 1,2 \\
-alpha off -quality 2400 -colorspace RGB -compose copy_opacity -composite \\
</textarea></div><br><br>
<input style='font-size:24px;padding:5 5 5 5;background-color:lightgreen;' type=submit value=Display></input>
</form>
</td></table>
<textarea style=display:none; id=myta>" . str_replace(dirname(__FILE__) . DIRECTORY_SEPARATOR, "", $cmd) . "</textarea>
</body>
</html>";
?>
