LDD questions


Re: LDD questions
#7
Hey again,

yes, it works. I played around with the phyton script and I was able to extract .tga files from the .3dxml files. I successfully extracted images from the LDD and from Lego Star Wars II.

It looks like the images are upside down, but I think that is just a small issue. There is one .lxf file available on eurobricks that contains all decorations. The script could extract them all at once.

Code:
import zipfile, base64, struct, os
import xml.etree.ElementTree as etree

def load_images(filename):
    if zipfile.is_zipfile(filename):
        zf = zipfile.ZipFile(filename, 'r')
        member = zf.namelist()[1]
        filename = zf.open(member)
        print 'Unzipping', member
    tree = etree.parse(filename)
    images = tree.find('.//{http://www.3ds.com/xsd/3DXML}ImageSet')
    numimages = len(images)
    print 'Number of images:', numimages
    #imgs = []
    for i in tree.findall('.//{http://www.3ds.com/xsd/3DXML}Pixel'):
        write_tga(i, numimages)
        #imgs.append(img)

def write_tga(image, numimages):
    h = int(image.attrib['height'])
    w = int(image.attrib['width'])
    fmt = image.attrib['format']
    pixels = image[0].text
    size = len(`numimages`)
    imgidx = image.attrib['id']
    imgidx = str('Map-%0'+`size`+'d') % int(imgidx)
    filename = imgidx + '.tga'
    bits = 32 if 'A' in fmt else 24
    alpha = 8 if 'A' in fmt else 0
    dirname = 'textures'
    if not os.path.exists(dirname): os.mkdir(dirname)
    pathname = os.path.join(dirname, filename)
    if not os.path.exists(pathname):
        print 'writing %s (%dx%d) %s' % (pathname, w, h, fmt.lower())
        with open(pathname, 'wb') as file:
            file.write(struct.pack('12B', 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0))
            file.write(struct.pack('HH', w, h))
            file.write(struct.pack('BB', bits, alpha))
            pixels = base64.b64decode(pixels) #$base64.b64decode(bytes(pixels, 'utf-8'))
            pixels = rgb_to_bgr(pixels, fmt)
            file.write(pixels)

def rgb_to_bgr(pixels, fmt):
    pixels = list(pixels)
    npixels = len(pixels)
    step = 4 if 'A' in fmt else 3
    for i in range(0, npixels, step):
        pixels[i],pixels[i+2] = pixels[i+2],pixels[i]
    #$pixels = map(chr, pixels)
    pixels = ''.join(pixels)
    #$pixels = bytes(pixels, 'latin-1')
    return pixels

I am not well versed with python! What I did:
  • Put the code in a file (e.g. extractimages.py)
  • Saved the script in the folder where the .3dxml files are
  • Opened a phyton console
  • Imported os (import os)
  • Changed directory in the python console to the path where the .3dxml files are (os.chdir('<path>'))
  • Imported the new script (import extractimages)
  • Extracted images (extractimages.load_images('<file>.3dxml'))

You will get a folder named 'textures'. I hope it works.

Rolf
Reply
« Next Oldest | Next Newest »



Messages In This Thread
LDD questions - by Daniel Goerner - 2012-04-07, 20:13
Re: LDD questions - by Travis Cobbs - 2012-04-08, 1:11
Re: LDD questions - by Tim Gould - 2012-04-08, 1:35
Re: LDD questions - by Daniel Goerner - 2012-04-08, 6:29
Re: LDD questions - by Rolf Osterthun - 2012-04-08, 20:49
Re: LDD questions - by Rolf Osterthun - 2012-04-10, 7:34
Re: LDD questions - by Rolf Osterthun - 2012-04-12, 21:25
Re: LDD questions - by Daniel Goerner - 2012-04-12, 23:41
Re: LDD questions - by Rolf Osterthun - 2012-04-13, 12:15
Re: LDD questions - by Joshua Delahunty - 2012-09-20, 2:01

Forum Jump:


Users browsing this thread: 1 Guest(s)