package GD::Barcode::Image;
use strict;
use Image::Magick;
use GD::Barcode;
require Exporter;
use vars qw($VERSION @ISA $AUTOLOAD);
@ISA     = qw(Exporter);    # HAS-A GD::Barcode:<Symbology>, no IS-A
$VERSION = 1.03;

# GD::Barcode::Image  extends GD::Barcode functionality.
# GD/ is a package with a single factory-like method named new()
# new() itself creates objects of a specific Symbology - Barcode Type,
# which are derived classes from GD::Barcode
# There are other functions in GD/ such as dumpCode, and even
# plot(), but these are not object methods, and since there is never any
# object created of class GD::Barcode, all are private functions.
# GD::Barcode::Image follows the implementation of GD::Barcode - which is
# easiest done by using a member object of GD::Barcode::<Symbology> type,
# and implementing plot_imagick and plot_gd functions.
# It would be possible to use AUTOLOAD and proxy all other methods of
# GD::Barcode::<Symbology> classes, but unless someone points out the need for
# that, leaving it out for now (see example after END in this file)
# And if absolutey needed: callers can look at the GD::Barcode::<Symbology>
# object in this object hash: $oThis->{gd_barcode}
# If these functions need to be merged into GD::Barcode, all that is to
# needed from this file are the two functions: plot_imagick and plot_gd -
# they will work with very minor modifications. The command-line script
# barcodegen should also be carried into GD::Barcode, if this module
# becomes obsolete.
# new() - create an object of this class
# [not a factory method - unlike GD::Barcode]
sub new($$$;$) {
    my $sClass = shift;
    my ($sType) = @_;

    # special check: since resides in GD/Barcode, there is
    # the danger that the GD::Barcode->new() function will load/init
    # this module as a Barcode Symbology. To prevent this, check for type.
    if ( grep( /^$sType$/i, 'Image' ) ) {
        $GD::Barcode::errStr = 'Error in new() - Invalid Barcode Type: "Image"';
        return undef;

    my $oThis = {};
    bless $oThis, $sClass;
    my $gdbc = GD::Barcode->new(@_);
    $oThis->{gd_barcode} = $gdbc;
    return $gdbc ? $oThis : undef;

# init (for GD::Barcode::Image)
# special check: since resides in GD/Barcode, there is
# the danger that the GD::Barcode->new() function will load/init this
# module as a Barcode Symbology, so check for type
sub init() {
    return 'Error in init() - Invalid Barcode Type: "Image"';

# plot_imagick: Convert to Image::Magick Object (for GD::Barcode)
# Requires both the GD and Image::Magick modules.
# signature is similar to GD::Barcode::QRcode->plot()
sub plot_imagick($%) {
    my ( $oThis, %hParam ) = @_;

    #Create Image
    my $imNew = undef;
    eval {
        require Image::Magick;

        my ( $gdNew, $png ) = ( undef, undef );

        $gdNew = $oThis->{gd_barcode}->plot(%hParam);
        if ($gdNew) {
            $png   = $gdNew->png();
            $imNew = Image::Magick->new();

            $GD::Barcode::errStr = $imNew->BlobToImage($png);
            $imNew               = undef
              if ($GD::Barcode::errStr);    # on error, free imagick object
    return $imNew;

# plot_gd: Convert to GD::Image Object (for GD::Barcode)
# plot_gd created to follow name pattern of "plot_imagick" - plot_<what>
# Requires the GD module.
sub plot_gd($%) {
    my ( $oThis, %hParam ) = @_;
    return $oThis->{gd_barcode}->plot(%hParam);




# proxy methods to the GD::Barcode::<Symbology> object
# functions like barcode(), Text() proxied
sub AUTOLOAD() {
    my $oThis = shift;
    my $gdbc = $oThis->{gd_barcode};
    my $method = $AUTOLOAD;
    $method =~ s/.*:://;
    $method = $gdbc->can($method);
    return $method ? $gdbc->$method(@_) : undef;

=head1 NAME

GD::Barcode::Image - Create Image::Magick object for a barcode


  use GD::Barcode::Image;

  my $oGdBarIm = GD::Barcode::Image->new( $type, $text, \%rhPrm );
  die "** Error: Barcode $type failed for $text: ${GD::Barcode::errStr}," 
    unless ($oGdBarIm);

  my $oGdIm = $oGdBarIm->plot_imagick( Height => I<pixels>, NoText => I<0 | 1>] );
  die "** Error: Image Conversion Failed: ${GD::Barcode::errStr}," 
    unless ($oGdBarIm);


This module adds minor extensions in functionality to the
B<GD::Barcode> module.  See the documentation for GD::Barcode and all its
barcode symbology types for additional information on the use of this

=over 4

=item new()

I<$oGdBarIm> = GD::Barcode::Image->new(I<$sType>, I<$sTxt>, I<\%rhPrm>);

Creates a GD::Barcode::Image object for text I<$sTxt>, for barcode
symbology type I<$sType>. 
Additional parameters can be provided for QRcode type - see
GD::Barcode::QRcode module in the GD::Barcode package.

=item plot_imagick()

I<$oGdIm> = $oGdBarIm->plot_imagick([Height => I<$iHeight>, NoText => I<0 | 1>]);

creates Image::Magick object for the barcode object.
I<$iHeight> is height of the image. If I<NoText> is 1, the image has no text image of I<$sTxt>.
Height and NoText parameters will not apply to the QRcode barcode type.

=item plot_gd()

I<$oGd> = $oGdBarIm->plot_gd([Height => I<$iHeight>, NoText => I<0 | 1>]);

Same as plot_imagick() except that a GD image object is returned.

=item $GD::Barcode::errStr

has error message. This is same error mechanism as in the GD::Barcode

=item barcodegen

This module also includes the command-line script B<barcodegen> that can
be used to create barcode images in various formats: GIF, JPEG, PNG, EPS,


=head1 AUTHOR

Avinash Chopde <>


Copyright (C) 2007 Avinash Chopde <>

=head1 LICENSE

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.

=head1 SEE ALSO