Graphics programming with libtiff: gray scale and colour images
The followup to the first article covers gray scale and colour images. Published online by IBM DeveloperWorks. [tags: libtiff tiff graphics]
The followup to the first article covers gray scale and colour images. Published online by IBM DeveloperWorks. [tags: libtiff tiff graphics]
My first online article, an introduction to programming with libtiff for IBM DeveloperWorks. Reprinted by AUUG in their magazine. [tags: libtiff tiff graphics]
Nemo then wanted weighted random numbers, so this item has been added to this page. The following script selects a random element from a weight list of options... #!/bin/bash # Copyright (c) Michael Still 2002 # Released under the terms of the GNU GPL # In this case, Nemo wants to be able to specify a list of items, with # weights associated with them... # $1 is the list with weights, in the form: # "1 frog 2 banana 3 hamster" # Scary assumption number one, people hand me correctly formatted lists # Incidentally, this will break with numbers exist in the items I am handed # e.g. Banana42 will break this NUMBERS=`echo $1 | sed 's/[^0-9 ]//g'` WORDS=`echo $1 | sed 's/[0-9]//g'` WEIGHTED="" # Build the list of options, including the weights for NUM in $NUMBERS do WORD=`echo $WORDS | sed 's/ .*$//'` WORDS=`echo $WORDS | sed "s/^$WORD *//"` COUNT=0 while [ $COUNT -lt $NUM ] do WEIGHTED=`echo "$WEIGHTED $WORD"` COUNT=$(( $COUNT + 1 )) done done # Get the random number LOBOUND=1 HIBOUND=`echo $WEIGHTED | wc -w` RANDMAX=32767 BINUMBER=$(( $LOBOUND + ($HIBOUND * $RANDOM) / ($RANDMAX + 1) )) # Get the item -- I can't use…
How good are these random numbers anyway? I generated 100,000 random numbers between 1 and 10, and then had a look at their frequency: 1: 9964 2: 10009 3: 9978 4: 10015 5: 9997 6: 10020 7: 10011 8: 10008 9: 10006 10: 9992 I would say that this is probably close enough to random for most users.
So, I was at a CLUG meeting last night, and one of the speakers had a whole bunch of bash scripts for XDM theming. Anyway, he was using a perl script to generate the random selection of the theme elements, and me and my big mouth offered that it could be done in bash itself. So here we are... Here's my post to the CLUG mailing list the next day: From mikal@stillhq.com Fri Mar 29 10:26:04 2002 Date: Fri, 29 Mar 2002 10:14:17 +1100 (EST) From: Michael Still To: Linux user group Subject: Nemo's bash challenge for the day Well, I said it could be done... The brief: Generate a random number, and then return that element from a list of elements, in bash The code: (Assuming that the arguements on the command line are the possible return options, and that the random number generator is running as a separate script) LOBOUND=0 HIBOUND=$# shift $(( $LOBOUND + ($HIBOUND * $RANDOM) / (32767 + 1) )) echo $1 See the attachments for some exploratory scripts I wrote while coming up with this truncated sh. There are 54 lines of comments / white spaces, to the 4 or so lines of actual…
This script gets the specified element form the list on the command line... #!/bin/bash # Select a specified item from a list. Copyright (c) Michael Still 2002 # Released under the terms of the GNU GPL # $1 is the number to get, $* except for $1 is the list of options, delimited # by a space each # We can the shift operation to get to the right number shift $1 echo $1
This script generates a bounded random number: #!/bin/bash # Generate a random number. Copyright (c) Michael Still 2002 # Released under the terms of the GNU GPL # # (Is it possible to copyright a single line of code?) # To quote from the rand manpage as to why we bound the random number this way: # # In Numerical Recipes in C: The Art of Scientific Computing # (William H. Press, Brian P. Flannery, Saul A. Teukolsky, # William T. Vetterling; New York: Cambridge University # Press, 1992 (2nd ed., p. 277)), the following comments are # made: # "If you want to generate a random integer between 1 # and 10, you should always do it by using high-order # bits, as in # # j=1+(int) (10.0*rand()/(RAND_MAX+1.0)); # # and never by anything resembling # # j=1+(rand() % 10); # # (which uses lower-order bits)." # To seed the random number generator, set RANDOM to a value... We can see # that the bash code (2.05a in this case) already does some seeding for us... # # brand () # { # rseed = rseed * 1103515245 + 12345; # return ((unsigned int)((rseed >> 16) & 32767)); /*…
/****************************************************************************** desex.c, an example of how to use the openssl DES implementation... Data is input on stdin, and the enrypted information is output to stdout. Prompts appear on stderr... This is an example of the Electronic Code Book mode, which is predictable for known input, and is not recommended. Copyright (c) Michael Still 2001 Released under the terms of the GNU GPL ******************************************************************************/ #include #include int main(int argc, char *argv[]){ des_cblock key, input, output; des_key_schedule sched; int c, i; fprintf(stderr, "Setting up the DES library...\n"); des_string_to_key("Mary had a little lamb, it's fleece as white as snow. Everywhere that Mary went, the lamb would surely go...", &key); fprintf(stderr, "Schedualling the key...\n"); switch(des_set_key_checked(&key, sched)){ case -1: fprintf(stderr, "Bad parity\n"); _exit(42); break; case -2: fprintf(stderr, "Key is weak\n"); _exit(42); break; } fprintf(stderr, "Start typing and hit ctrl-d to finish...\n"); i = 0; while((c = fgetc(stdin)) != EOF){ input[i] = c; i++; if(i == 8){ des_ecb_encrypt(&input, &output, sched, DES_ENCRYPT); fprintf(stdout, "%c%c%c%c%c%c%c%c", output[0], output[1], output[2], output[3], output[4], output[5], output[6], output[7]); i = 0; } } }
/****************************************************************************** desex.c, an example of how to use the openssl DES implementation... Data is input on stdin, and the enrypted information is output to stdout. Prompts appear on stderr... This is an example of the Electronic Code Book mode, which is predictable for known input, and is not recommended. Copyright (c) Michael Still 2001 Released under the terms of the GNU GPL ******************************************************************************/ #include #include int main(int argc, char *argv[]){ des_cblock key, input, output; des_key_schedule sched; int c, i; fprintf(stderr, "Setting up the DES library...\n"); des_string_to_key("Mary had a little lamb, it's fleece as white as snow. Everywhere that Mary went, the lamb would surely go...", &key); fprintf(stderr, "Schedualling the key...\n"); switch(des_set_key_checked(&key, sched)){ case -1: fprintf(stderr, "Bad parity\n"); _exit(42); break; case -2: fprintf(stderr, "Key is weak\n"); _exit(42); break; } fprintf(stderr, "Start typing and hit ctrl-d to finish...\n"); i = 0; while((c = fgetc(stdin)) != EOF){ input[i] = c; i++; if(i == 8){ des_ecb_encrypt(&input, &output, sched, DES_DECRYPT); fprintf(stdout, "%c%c%c%c%c%c%c%c", output[0], output[1], output[2], output[3], output[4], output[5], output[6], output[7]); i = 0; } } }
This page contains some DES example code I wrote in reaction to a crypto tutorial I attended a while ago. I finally got around to putting the code online... The basic point of the code is it shows you how to use the DES calls within openssl. It also shows how the electronic code book for of DES is a bad choice for vaguely predictable data such as images. A visual demonstration of this is these two images. The one on the right is an encrypted version of the one on the left... The vertical flip of the image is because of the way libtiff reads colour images, and to be honest isn't worth fixing for this example.