W3C home > Mailing lists > Public > www-svg@w3.org > May 2003

svg convertion tools

From: Fred P. <fprog26@hotmail.com>
Date: Thu, 15 May 2003 20:21:05 -0400
To: dhjnavy@hotmail.com, www-svg@w3.org
Message-ID: <BAY2-F1592U8QVjp3b60001dd5a@hotmail.com>

From: "" <dhjnavy@hotmail.com>
To: www-svg@w3.org
Date: Sat, 10 May 2003 10:22:59 +0800
Message-ID: <Law15-F70NLUwnKSVmB0000e4e3@hotmail.com>
Subject: svg convertion tools


hello, anyone can tell me which is the best tool that can convert other
formats ( such as jpeg, bmp, gif) into svg.
Any help will be helpful!

This one is for BMP, using Paint you can convert GIF/JPG into BMP...

I'm planning to write a more efficient version using a more vectorial 
approach, later on.
here's an output example: http://j2k.sourceforge.net/svg/btn_all4.svgz

Required:
http://j2k.sf.net/svg/bmp2png.exe
http://j2k.sf.net/svg/png2svg.pl.txt

Example file:
http://j2k.sf.net/svg/new.bmp
http://j2k.sf.net/svg/new.png
http://j2k.sf.net/svg/new.svg


#!/usr/bin/perl

############################################################################
###   May be used or extended under the LGPL license                     ###
############################################################################
###   Copyright(c) Fred P. 1998-2003 - All rights reserved.              ###
############################################################################
###   Version 2.0 - Fred - Build 14 may 2003                             ###
############################################################################
###                                                                      ###
###   PNG2SVG : Transformation using vertically linear pixelization      ###
###                                                                      ###
############################################################################
###   Single file:                                                       ###
############################################################################
###                 zero compression                                     ###
###   C:\> bmp2png -0      file.bmp                                      ###
###   C:\> perl png2svg.pl file.png  HEADER                              ###
###                                                                      ###
############################################################################
###   Batch file:                                                        ###
############################################################################
###                 zero compression                                     ###
###   C:\> bmp2png -0      file1.bmp                                     ###
###   C:\> perl png2svg.pl file1.png  HEADER                             ###
###   C:\> bmp2png -0      file2.bmp                                     ###
###   C:\> perl png2svg.pl file2.png                                     ###
###   C:\> bmp2png -0      file3.bmp                                     ###
###   C:\> perl png2svg.pl file3.png                                     ###
###   C:\> copy /b file1.svg+file2.svg+file3.svg  fileall.svg            ###
###                                                                      ###
############################################################################
###                                                                      ###
###   Require bmp2png tool:                                              ###
###   http://pmt.sourceforge.net/bmp2png/                                ###
###                                                                      ###
############################################################################
###                                                                      ###
###   Require ActiveState ActivePerl 5.6.0                               ###
###   with GD package                                                    ###
###                                                                      ###
###   C:\> ppm                                                           ###
###   install GD                                                         ###
###   y                                                                  ###
###   exit                                                               ###
###                                                                      ###
############################################################################

use strict;

############################################################################
### Package usage definition:                                            ###
############################################################################

use GD;
#use GD::Image;
use Data::Dumper;

############################################################################
#  http://search.cpan.org/author/JHI/perl-5.8.0/ext/Data/Dumper/Dumper.pm  #
############################################################################
$Data::Dumper::Terse    = 1;
$Data::Dumper::Deepcopy = 1;
#$Data::Dumper::Sortkeys = 1;

############################################################################
### Global variables definitions                                         ###
############################################################################

use vars qw/
$name
$file
$file_png
$file_svg
$bg
$image
@pixel
$width
$height
@data
@rect
$x
$y
$x1
$x2
$y1
$y2
$WANT_HEADER
/;

############################################################################
### Skipping header for batch icons                                      ###
############################################################################

$WANT_HEADER = 0;

############################################################################
### Add space for formatting purposes                                    ###
############################################################################

sub add_space( $$ )
{
  my $string = $_[0];
  my $wanted = $_[1];
  my $len    = length( $string );

  my $sp = "";

  for( my $i = $len; $i < $wanted; $i++ )
  {
    $sp .= " ";
  }

  return $sp . $string;
}

############################################################################
### Open and create a new SVG file for output                            ###
############################################################################

sub openSVG()
{
  open (SVG, "> $file_svg" ) || die;

  if ( $WANT_HEADER )
  {

  print SVG <<EOF;
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE svg SYSTEM 
"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd">
<svg height="600" width="1000"
   xmlns:xlink="http://www.w3.org/2000/xlink/namespace/">
  <defs>
EOF
  }
}

############################################################################
### Close SVG output file                                                ###
############################################################################

sub closeSVG()
{
  if ( $WANT_HEADER )
  {
  print SVG <<EOF;
  </defs>
EOF

  my $x = 0;
  my $y = 0;

  for my $k ( 0 .. $#data )
  {
    print SVG "  <use xlink:href='#". $data[$k] ."' x='$x' y='$y' />\n";
    $y += 30;
  }

  print SVG <<EOF;
</svg>
EOF
  }

  close SVG;
}

############################################################################
### Read PNG image file                                                  ###
############################################################################

sub readPNG()
{
  $file_png =~ /(\.png)\s*$/i;
  $file     = $`;
  $file_svg = $file . '.svg';

  $file =~ /([^\/\\]+)$/i;
  $file = $1;
  $name = $file;
  $name =~ s/btn_//gi;

  print "Object:   $file\n";
  print "PNG file: $file_png\n";
  print "SVG file: $file_svg\n";

  open (PNG,    $file_png  ) || die;
  binmode PNG;
  $image = newFromPng GD::Image(\*PNG) || die;
  close PNG;

  ($width,$height)    = $image->getBounds();
}

############################################################################
### Retrieve a specific (X,Y) pixel RGB color in HEX web format          ###
############################################################################

sub getPixel( $$ )
{
  my ( $x, $y ) = @_;

  my ($red,$green,$blue) = $image->rgb( $image->getPixel($x,$y) );

  my $hr = sprintf("%.2X", $red  );
  my $hg = sprintf("%.2X", $green);
  my $hb = sprintf("%.2X", $blue );

  my $h  = '#'.$hr.$hg.$hb;

  return $h;
}

############################################################################
### Retrieve (X,Y) matrix of RGB color in HEX web format                 ###
############################################################################

sub getMatrix()
{
  my $g;
  my $prev = undef;
  my $start_y = 0;
  my $end_y   = 0;

  $x1 = $width;
  $y1 = $height;
  $x2 = 0;
  $y2 = 0;

  push @data, $name;

   print SVG "    <g id='$name' clone='false' drag='false'>\n";

  for $x ( 0 .. $width-1 )
  {
    for $y ( 0 .. $height-1 )
    {
      my $rgb = getPixel( $x, $y );
        $pixel[$x][$y][0] = $rgb;
        $pixel[$x][$y][1] = 0;

        #############################
        # Find DY rectangle
        #############################
        if ( $prev eq $rgb )
        {
          $end_y = $y;
        }
        else
        {
          if ( $prev )
          {
            $prev =~ s/ //g;

            #############################
            # Store <rect>
            #############################

            my $h2 = $end_y - $start_y + 1;

            if ( $prev ne $bg ) #&& $h2 > 1 )
            {
              push @rect, [ $prev, 1, $h2, $x, $start_y ];
            }

            if ( $h2 > 1 )
            {
              for my $dy ( $start_y .. $end_y )
              {
                $pixel[$x][$dy][1] = 1;
              }
            }
          }

          #############################
          # Start a new DY <rect>
          #############################
          $prev    = $rgb;
          $start_y = $y;
          $end_y   = $y;
        }

      if ( $rgb ne $bg )
      {
        if ( $x < $x1 ) { $x1 = $x; }
        if ( $y < $y1 ) { $y1 = $y; }
        if ( $x > $x1 ) { $x2 = $x; }
        if ( $y > $y1 ) { $y2 = $y; }
      }
    }

    $prev = " $prev";
  }

  print SVG  "      <!-- Width: $width  and  Height: $height -->\n";
  print SVG  "      <!-- Corner Markers: ( $x1, $y1 ) to ( $x2, $y2 ) 
-->\n";
  printRect( '' );
}

############################################################################
### Process (X,Y) matrix                                                 ###
############################################################################

sub processMatrix()
{
  my $start_x = 0;
  my $end_x   = 0;
  my $prev    = "";
  my $g;
  push @rect, "\n";

  for $y ( $y1 .. $y2 )
  {
    for $x ( $x1 .. $x2 )
    {
      my $rgb = getPixel( $x, $y );

      if ( $rgb ne $bg )
      {
        $pixel[$x][$y][0] = $rgb;

        ###############################
        # Find DX rectangle
        ###############################
        if ( $prev eq $rgb )
        {
          $end_x = $x;
        }
        else
        {
          if ( $prev ne "" )
          {
            $prev =~ s/ //g;

            ###############################
            # Store <rect>
            ###############################

            my $w2 = $end_x - $start_x + 1;

            # $g = "  <rect style='fill:$prev' width='". add_space($w2,2) .
            #      "' height=' 1' x='". add_space($start_x,2) .
            #      "' y='". add_space($y,2) ."'/>";

            push @rect, [ $prev, $w2, 1, $start_x, $y ];

            if ( $w2 > 1 )
            {
              for my $dx ( $start_x .. $end_x )
              {
                $pixel[$dx][$y][1] = 1;
              }
            }
          }

          ###############################
          # Start a new DY <rect>
          ###############################
          $prev    = $rgb;
          $start_x = $x;
          $end_x   = $x;
        }
      }
    }
    $prev = " $prev";
  }
}

############################################################################
### Print an SVG rectangle                                               ###
############################################################################

sub printRect($)
{
  my $name3 = $name . $_[0];
  my $g;

  push @data, $name3;

  for my $i ( 0 .. $#rect )
  {
    my ( $prev, $w, $h, $x, $y ) = @{ $rect[ $i ] };
    $x -= $x1;
    $y -= $y1;
    $g = "      <rect style='fill:$prev' width='". add_space($w,2) .
         "' height='". add_space($h,2) .
         "' x='". add_space($x,2) .
         "' y='". add_space($y,2) ."'/>\n";

    print SVG $g;
  }

  print SVG "    </g>\n";
}

############################################################################
### Main function                                                        ###
############################################################################

sub main($$)
{

  $file_png = "new.png";

  if ( $_[0] )
  {
    $file_png = $_[0];
  }

  if ( $_[1] )
  {
    $WANT_HEADER = $_[1] + 0;
  }

  @data      = ();
  @rect      = ();
  readPNG();
  $bg        = getPixel( 0,0 );
  openSVG();
  getMatrix();

  closeSVG();
}

############################################################################
### Script entry point                                                   ###
############################################################################

main( $ARGV[0], $ARGV[1] );
exit;
1;

__END__

_________________________________________________________________
Help STOP SPAM with the new MSN 8 and get 2 months FREE*   
http://join.msn.com/?page=features/junkmail
Received on Thursday, 15 May 2003 20:21:12 GMT

This archive was generated by hypermail 2.3.1 : Friday, 8 March 2013 15:54:25 GMT