On Thu, Oct 9, 2008 at 9:52 AM, Kevin Cozens <[EMAIL PROTECTED]> wrote:
> Hedley Finger wrote:
>> Can anybody point me to a Gimp plug-in or external utility that can
>> convert *.ase swatch files from Adobe Kuler to Gimp *.gpl files please?
>
> If you haven't found anything using Google and there is no plug-in already
> available in the registry, someone will have to create a plug-in, or script
> file, to do the conversion. That someone will need to have access to .ase
> files and to the details of the format of those files.

OK - I took a shot at a plug-in.  I doubt that it works properly under
Windows - I have not had time to test it (yet).  Also, once the
palette is loaded (if it works :), you need to manually refresh the
palette list - the new palette will appear toward the top.  This
plug-in does not handle the full ASE spec (notably RBG only)- I doubt
ASE files from sources other than Kuler will work.  If you are not
using GIMP from current svn, you need to change the 'gimp_folder'
variable at the top of the file to match your .gimp folder.

Oh yeah - it's under 'Filters->Import ASE palette...' - I need to move
it somewhere more useful.

There are a ton of FIXME items that I still need to attend to, but if
anyone is feeling brave, I'd love feedback on it...

Chris

PS - (unofficial) ASE file spec is here:
http://www.selapa.net/couleurs/fileformats.php
#!/usr/bin/env python
# Author: Chris Mohler
# Copyright 2008 Chris Mohler
# License: GPL v3
# GIMP plugin to convert ASE palettes to GPL palettes

#FIXME - is there a way to autogenerate this?
gimp_folder = ".gimp-2.7" # for the target directory - change to gimp-2.6, but not gimp-2.6.1, for example

from gimpfu import *
import sys,  os,  re
from struct import unpack_from,  unpack

home_dir = os.environ['HOME'] #FIXME - does this work on windows?
pal_dir = os.path.join(home_dir,  gimp_folder,  "palettes") 
#print ("Palette Dir: " + pal_dir)

# Get file name from command line, if exists - UNTESTED
if (sys.argv[1] != "-gimp"):
    this_file = sys.argv[1]
    print "ASE file: " + this_file


def ase_converter(this_file):
    
    #print "ASE file: " + this_file
    
    # Strip of the "file:///" prefix - if called by nautilus, etc
    if this_file.startswith('file:///'):
        this_file = this_file.replace('file:///', '/')
        
    try:
        pal_gpl = "GIMP Palette\nName: " # start GPL (GIMP Palette) file
        NUL = chr(0) # NULL byte
        SoH = chr(1) # Start of ASE separator byte
        f = open(this_file) #open ASE file
        ase_header = f.read(4) # first 4 bytes
        #print("ASE Header: " + ase_header)
        if ase_header == "ASEF": # first 4 bytes should be "ASEF"
            ase_version = f.read(4) # next 4 bytes are version - we don't need this.
            ase_swatches_data = f.read() # rest of the file should be swatch data
            #print ("ASE Swatches data: " + ase_swatches_data)
            ase_swatches = ase_swatches_data.split(SoH + NUL + NUL + NUL) # split by seperator
            pal_len = ase_swatches.pop(0) # This seems to be the file length - I don't think we need it
            pal_title_data = ase_swatches.pop(0).lstrip() #This should be the title of the palette
            pal_title = ""
            # check for strange characters in the palette name
            for c in pal_title_data:
                char = unpack('>s',  c) # Little endian string
                if re.match("[A-Za-z0-9_\-]",  char[0]):
                    pal_title += char[0] # only add if A-Z or 0-9
            #print ("Palette title: " + pal_title)
            pal_gpl += pal_title + "\nColumns: 1\n#\n" #Finish GPL header info
            j = 0
            for swatch in ase_swatches:
                j = j+1
                swatch = swatch.lstrip().split(" ",  1) # split on the first space
                swatch[0] = swatch[0].replace("\x16\x00\x01\x00\x00", "") # strip "funk" from swatch color mode
                #print swatch[0]
                if swatch[0] == "RGB": # only operate on RGB swatches
                    red = unpack_from('>f',  swatch[1]) #read 4 bytes, unpack to float - little endian
                    green = unpack_from('>f',  swatch[1],  4) #next 4 bytes
                    blue = unpack_from('>f',  swatch[1],  8) #next 4 bytes
                    red = (red[0] * 255) # multiply float by 255
                    red = int(round(red,  0)) # round to int
                    green = (green[0] * 255)
                    green = int(round(green,  0))
                    blue = (blue[0] * 255)
                    blue = int(round(blue,  0))
                    #print red,  green ,  blue
                    # Add each swatch's RGB values to the GPL
                    pal_gpl += str(red) + "\t" + str(green) + "\t" + str(blue) + "\t" + "Color_" + str(j) + "\n"
            #print pal_gpl
            pal_file = os.path.join(pal_dir,  (pal_title + ".gpl"))
            #print pal_file
            pf = open(pal_file,  'w') #open palette file
            pf.write(pal_gpl) # write GPL data
            pf.close # close file handle
    except Exception, e:
        # Oops! Cowardly bailing out!
        print '%s: %s' % (e.__class__.__name__, e)
        if isinstance(e, SystemExit): 
            raise # take the exit
            #FIXME - show a GIMP error here!
    except:
        print 'Nonstandard Exception %r: %r' % __import__('sys').exc_info()[:2]
        #FIXME - show a GIMP error here!
        pdb.gimp_quit(0)
        sys.exit()
    
    # if called from CLI, quit GIMP
    if (sys.argv[1] != "-gimp"):
      pdb.gimp_quit(0)

register(
	"python-fu-convert-ase",
	"Convert ASE palette to GIMP palette",
	"Convert ASE palette to GIMP palette",
	"Chris Mohler",
	"Chris Mohler",
	"2008",
	"<Toolbox>/Xtns/Import ASE palette...", #FIXME - this is not the correct spot to attach!
	"",
	[
		(PF_FILE, "this_file", "ASE File", ""),
	],
	[],
	ase_converter)

main()
_______________________________________________
Gimp-user mailing list
Gimp-user@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user

Reply via email to