| GSM-SMS documentation | Contained in the GSM-SMS distribution. |
GSM::SMS::OTA::Bitmap
Used to create a ota bitmap to use in CLI and OPERATOR logo's, also the double height format as in a PictureMessage is supported. We use the perlinterface to ImageMagick instead of the 'convert' command from the same package.
$ref_bitmaparray = OTABitmap_fromb64($bitmap_image_b64, $format_of_image);
Expects a bitmap in base64 format and the format of the image (e.g. 'gif', 'png'). The base64 method is here to be able to use the function in a webcentric way. This way you can e.g. use xmlrpc calls to exchange images for sending via SMS.
$ref_bitmaparray = OTABitmap_fromfile($image_file);
Create a bitmap array from a file.
$stream = OTABitmap_makestream( $width, $height, $depth, $ref_bitmaparray );
Create an OTA Bitmap. Width is 72 and height is 14 or 28 pixels, you can find those back in the constants BITMAP_WIDTH, BITMAP_HEIGHT and BITMAP_HEIGHT_DOUBLE.
Johan Van den Brande <johan@vandenbrande.com>
| GSM-SMS documentation | Contained in the GSM-SMS distribution. |
package GSM::SMS::OTA::Bitmap; # Generic package for OTA bitmaps require Exporter; @ISA = qw(Exporter); @EXPORT = qw( BITMAP_WIDTH BITMAP_HEIGHT BITMAP_HEIGHT_DOUBLE OTABitmap_makestream OTABitmap_fromfile OTABitmap_fromb64 ); $VERSION = "0.161"; use constant BITMAP_WIDTH => 72; use constant BITMAP_HEIGHT => 14; use constant BITMAP_HEIGHT_DOUBLE => 28; use MIME::Base64; use Image::Magick; sub OTABitmap_makestream { my ($width, $height, $depth, $ref_bytearray) = @_; my $stream=''; $stream.= sprintf("%02X", $width); $stream.= sprintf("%02X", $height); $stream.= sprintf("%02X", $depth); foreach my $byte (@$ref_bytearray) { $stream.= uc unpack ('H2' , $byte); } return $stream; } sub OTABitmap_fromfile { my ($filename) = @_; my $image = Image::Magick->new( ); return -1 unless $image; $image->Read( $filename ); # check image size(s) # 1. width return -1 unless ( $image->Get('columns') == BITMAP_WIDTH ); # 2. height return -1 unless ( $image->Get('height') == BITMAP_HEIGHT || $image->Get('height') == BITMAP_HEIGHT_DOUBLE ); # convert to monochrome $image->Set("magick" => "mono"); my $monochrome = $image->ImageToBlob( ); # reverse bitorder my @ba; foreach my $b ( split //, $monochrome ) { my $byte = reverse(unpack("B8", $b)); push(@ba, pack("B8", $byte)); } # get dimensions my $width = $image->Get('columns'); my $height = $image->Get('height'); undef $image; return (\@ba, $width, $height); } sub OTABitmap_fromb64 { my ($b64image, $format) = @_; my $blob = decode_base64( $b64image ); my $image = Image::Magick->new( magick => $format ); return -1 unless $image; # wrong format ;-) $image->BlobToImage( $blob ); # check image size(s) # 1. width return -1 unless ( $image->Get('columns') == BITMAP_WIDTH ); # 2. height return -1 unless ( $image->Get('height') == BITMAP_HEIGHT || $image->Get('height') == BITMAP_HEIGHT_DOUBLE ); # convert to monochrome $image->Set(magick => 'mono'); my $monochrome = $image->ImageToBlob( ); # reverse bitorder my @ba; foreach my $b ( split //, $monochrome ) { my $byte = reverse(unpack("B8", $b)); push(@ba, pack("B8", $byte)); } my $width = $image->Get('columns'); my $height = $image->Get('height'); undef $image; return (\@ba, $width, $height); } 1;