gif2xface.pl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/perl
  2. #
  3. # gif2xface -- converts a 48x48 GIF file to an X-Face mail header
  4. #
  5. # Author: Ricardo Mones <ricardo@mones.org>
  6. #
  7. # This is a hack over the original xbm2face script. The xbm files generated
  8. # by some graphic tools (notably The Gimp version 1.2.1) aren't suitable to
  9. # feed the compface program. Starting with a GIF and using some filters does
  10. # the trick. A little help screen also added.
  11. # This requieres giftopnm and pbmtoxbm (both in libgr-progs package).
  12. #
  13. # The original xbm2face author's comment follows:
  14. #
  15. # xbm2xface -- converts a 48x48 xbm file to an X-Face mail header
  16. #
  17. # Author: Jonathan Stigelman <Stig@hackvan.com>
  18. #
  19. # URL: http://hackvan.com/pub/stig/src/linux/
  20. # FTP: hackvan.com:/pub/stig/src/linux/
  21. #
  22. # This is a Perl script that I wrote to convert 48x48 xbm (X bitmap) files
  23. # into X-Face: headers suitable for inclusion in RFC822 internet
  24. # electronic mail. A 48x48 bitmap is awfully small, but X-Faces are still
  25. # good enough for other people to visually establish your identity in
  26. # email without having to carefully read your name.
  27. #
  28. # Basically, it gets you noticed...either as the person with the cool
  29. # X-Face or as that jerk with modem noise in all of his email messages.
  30. #
  31. # People will start looking over your shoulder and say "Hey Cool! How'd
  32. # you do that?" When they do, you just send 'em to my URL for this
  33. # utility and tell 'em to upgrade to a real mail reader: XEmacs and VM.
  34. #
  35. # It also requires the 'compface' utility.
  36. #
  37. sub check_for_help {
  38. local($param) = @_;
  39. # is a filter, no args must be present
  40. if (defined($param))
  41. {
  42. print "\n", 'gif2xface -- A filter for converting an 48x48 gif into a xface string', "\n\n" ;
  43. print 'Usage: gif2xface < input.gif > output.xface', "\n\n";
  44. exit;
  45. }
  46. }
  47. sub reverse_byte {
  48. local($byte) = @_;
  49. local($n, $b);
  50. for ( $b= $n= 0; $b<8; ++$b) {
  51. $n |= (($byte & 1) << (7-$b));
  52. $byte >>= 1;
  53. }
  54. return($n);
  55. }
  56. &check_for_help($ARGV[0]);
  57. # printf "0x%02x\n", &reverse_byte(0xF0);
  58. $ra = rand;
  59. $tf = "/tmp/gif2xface.$ra";
  60. open(GP,"|giftopnm|pbmtoxbm>$tf");
  61. while (<>) {
  62. print GP $_;
  63. }
  64. close(GP);
  65. open(GP,"<$tf");
  66. <GP>;
  67. m/^#define \w+_width (\d+)/ && ($width=$1);
  68. <GP>;
  69. m/^#define \w+_height (\d+)/ && ($height=$1);
  70. <GP>;
  71. m/^static.* = \{/ && (( $width == 48 && $height == 48 )
  72. || die $0, ": sorry, xfaces must be 48x48 pixels" );
  73. $| = 1; print "X-Face:";
  74. open(CF,"|compface");
  75. while (<GP>) {
  76. $st="";
  77. while (s/(0x..)(,|\};)\s*//) {
  78. $st .= sprintf("0x%02x, ", &reverse_byte(eval($1)));
  79. }
  80. $_=$st;
  81. s/(0x..), 0x(..)/\1\2/g;
  82. s/\s*(0x...., 0x...., 0x....)(,|\};)\s/\1,\n/g;
  83. print CF $_;
  84. }
  85. close (CF);
  86. close (GP);
  87. unlink $tf;