FW: This code performs the rather esoteric function of converting an image file to a raw HTML page, using a <table> tag with a cell for each pixel. The output is, of course, huge, and will crash some older browsers or systems. The only use I can think of this is if you had a hosting service which had tons of bandwidth but didn't support images, and
really needed one.
Yes, I realize this isn't quite standard HTML with doctypes and all that, but for something this useless I don't think it's worth being precise ;)
proc htmlize {image_file save_to} {
set page [open $save_to w]
set source [image create photo -file $image_file]
puts -nonewline $page {<html><head></head><body><table border=0 cellspacing=0 cellpadding=0>}
foreach row [$source data] {
puts -nonewline $page {<tr>}
foreach color $row {
puts -nonewline $page "<td width=1 height=1 bgcolor=$color></td>"
}
puts -nonewline $page {</tr>}
}
puts -nonewline $page {</table></body></html>}
close $page
}
Feedback: meh: Found it quite useful in
CGI scripts for human verification. Stops them just matching the image filename to a set of corresponding characters - with some modification, random parts of the image can be modified to further deter non-human usage. Good work :)
FW: Thanks. It happens that the more accepted way to achieve the first effect is by using a second script that sends through the appropriate image file (or generates one). To alter random parts or otherwise custom generate
CAPTCHAs you can use the image tools directly.
meh: Oh, it was more a temporary solution until I figured out how to use TclMagick :p
Sarnold: You may gain bandwidth (I guess that would help) by generating all this HTML code with
Javascript. It may be something like :
function line(row) {
var i;
// increment by steps 6 because the color is stored in 6 characters
for (i=0;i<row.length;i+=6) {
document.writeln("<td width=1 height=1 bgcolor="+row.substring(i,i+5)+"></td>");
}
}
function nextline() {document.write("</tr><tr>");}
then, in your HTML body, just append:
<table><tr>
<script language=javascript>
line("FFFFFFF...."); // put some pixels, you can split 1 line into n calls
...
nextline(); // go to the next line by writing </tr><tr>
line("DDDDDDDDD...");
...
line("FFFFFFFFF..."); // the last call should not be nextline(), because we do not want to start a new line
</script>
<!-- end here the line, and the table also -->
</tr></table>