cloning
link-mesh-array.py
link-mesh.py

mesh fabrication
staircase.py
triangle-donut.py
vertexAccumulator.py
randomSquareArray.py
meshFromBathymetry.py
cylinders-from-list-of-radii.py
binary-image-to-mesh.py
sphere-minecraft-schematic.py
spikify.py
add-to-mesh.py
mobius-strip.py
split-copy-mesh.py

fabricating other objects
create-text.py
text-from-file.py
create-camera.py
create-bezier.py
helix-bezier.py

material slots
cube-copy-blue.py
cube-turns-red.py
red-blue-per-object.py

animation and fcurves
csv-to-fcurve-loc-rot.py
csv-to-fcurve.py
pop-in-material.py
spike-wiggle-2.py
spike-wiggle.py
sweep-animate-size.py
animate-cycles-lamp-strength.py

incorporating python libraries
exec-text-library.py
exec-external-python.py
import-python.py

constraints
camera-track-object.py
text-track-camera.py

shape keys
explore-shape-keys.py
shape-key-fin.py
docking-tube.py

animating curve bevel
data-graph.py

drivers
scan-drivers.py
copy-drivers.py
driver-fin.py
driver-multi-chain.py

UV layers
barber-pole.py
expand-uv-to-fit.py
uv-from-geometry-cubic.py
flip-texture-v-coordinate.py

modifiers
hook-modifier-curve.py
rounded-prisms.py
make-tile.py
remove-action-modifiers.py

NLAs
explore-NLAs.py
spinning-frogs.py

video sequence editor (VSE)
create-vse-image-strips.py
slide-show.py
vse-strip-gap.py

images and textures
image-on-mesh.py
image-to-material-node.py
load-image-texture.py
texture-one-cube-face.py
condense-duplicate-images.py

analytic geometry
animate-random-spin.py
camera-cone-exp-2.py
camera-cone-exp.py
compute-circle-center.py
dihedral-angle-from-xy.py
extrude-edge-along-custom-axis.py
orientation-matrix.py
two-spheres.py
bezier-interpolate.py
rotate-to-match.py

node trees
change-diffuse-to-emission-node.py

etc
add-plane-from-selected-vertices.py
adjust-all-materials.py
all-nodes-cycles-materials.py
bit_shift.py
bone-orientation-demo.py
cannonball-packing.py
comb.py
convert-quaternion-keyframes-to-euler.py
copy-location-from-vertex-group.py
create-cycles-material.py
demonstrate-decomposition-instability.py
dump-point-cache.py
dump-screen-layout-info.py
expand-nla-strips.py
explore-edge-bevel-weight.py
find-action-users.py
find-green-rectangle.py
find-new-objects.py
fix-scene-layers.py
generate-makefile.py
link-external-data-blocks.py
list-referenced-files.py
material-readout.py
movie-card-stack.py
movies-on-faces.py
next-file-name.py
object-font-from-regular-font.py
operator-mesh-gridify.py
particle-animator.py
particle_loop.py
pose-match.py
pose-sequence-to-fbx.py
prepare-texture-bake.py
raining-physics.py
random-pebble-material.py
reverse-keyframes.py
scale-parallelogram.py
screenshot-sequence.py
select-objects-in-modifiers.py
select-vertices.py
shift-layers.py
snapshot-keyframes-as-mesh.py
sphere-project-texture.py
squish-mesh-axis.py
subdivide-fcurve.py
thicken-texture.py
transform-selected.py
voronoi-madness.py

import bpy
import bmesh


# this assumes you have copied the vertexAccumulator.py script
# into another text buffer named 'vertexAccumulator'
exec(bpy.data.texts['vertexAccumulator.py'].as_string())


def getAlpha(img, x, y):
    w,h = img.size
    if x<0 or x>= w or y<0 or y>=h:
        return 0
    o = x + y * w
    return img.pixels[o*4+3]


def addFaceAndUV(verts, faces, uvs, va, width, height, uv_adj_x=0, uv_adj_y=0):

    faces.append([ va.idxFor(v) for v in verts])

    uvForFace = [ [(v[0]+uv_adj_x)/width, (v[1]+uv_adj_y)/height] for v in verts ]
    uvs.append(uvForFace)


def addFaces(x, y, width, height, faces, img, uvs, va):
    a = getAlpha(img, x, y)
    if (a > 0):
        addFaceAndUV([[x, y, 0],
            [x + 1, y, 0],
            [x + 1, y + 1, 0],
            [x, y + 1, 0]], faces, uvs, va, width, height)

        addFaceAndUV([ [x, y, -1],
                  [x, y + 1, -1],
                  [x + 1, y + 1, -1],
                  [x + 1, y, -1] ], faces, uvs, va, width, height)

        if getAlpha(img, x - 1, y) <= 0:
            addFaceAndUV([[x, y, 0],
                [x, y +1, 0],
                [x, y +1, -1],
                [x, y, -1],], faces, uvs, va, width, height, 0.01, 0)
        if getAlpha(img, x + 1, y) <= 0:
            addFaceAndUV([[x + 1, y, 0],
                [x + 1, y, -1],
                [x + 1, y + 1, -1],
                [x + 1, y + 1, 0],], faces, uvs, va, width, height, -0.01,0)

        if getAlpha(img, x, y - 1) <= 0:
            addFaceAndUV([[x, y, 0],
                [x, y, -1],
                [x + 1, y, -1],
                [x + 1, y, 0],], faces, uvs, va, width, height, 0, 0.01)

        if getAlpha(img, x, y +1) <= 0:
            addFaceAndUV([[x, y + 1, 0],
                [x + 1, y + 1, 0],
                [x + 1, y + 1, -1],
                [x, y + 1, -1],], faces, uvs, va, width, height, 0, -0.01)


def makeMeshForImage(img, name):
    width,height = img.size
    print (height)

    va = VertexAccumulator()
    faces = []
    uvs = []

    for y in range(height):
        for x in range(width):
            addFaces(x, y, width, height, faces, img, uvs, va)

    mesh = bpy.data.meshes.new(name)
    mesh.from_pydata(va.verts(), [] , faces)

    apply_UVs(mesh, uvs)

    set_preview_tex(mesh, img)

    return mesh


def apply_UVs(mesh, uvs):
    # add a UV layer called "spiral" and make it slanted.
    mesh.uv_textures.new("simple")
    bm = bmesh.new()
    bm.from_mesh(mesh)
    bm.faces.ensure_lookup_table()

    uv_layer = bm.loops.layers.uv[0]

    nFaces = len(bm.faces)
    for fi in range(nFaces):
        x0 = fi*2/nFaces
        x1 = (fi+1)*2/nFaces
        for j in range(len(uvs[fi])):
            bm.faces[fi].loops[j][uv_layer].uv = uvs[fi][j]
    bm.to_mesh(mesh)

# put the image behind the UV layer for the times when you're using the Multitexture shader on the 3D view.
def set_preview_tex(mesh, img):
    bm = bmesh.new()
    bm.from_mesh(mesh)
    tl = bm.faces.layers.tex.active
    if tl:
        for f in bm.faces:
            f[tl].image = img
    bm.to_mesh(mesh)

def material_for(img):
    rval = bpy.data.materials.get(img.name)

    if rval is None:
        tex = bpy.data.textures.new(img.name, 'IMAGE')
        tex.image = img
        tex.use_interpolation=False
        tex.filter_type = 'BOX'

        rval = bpy.data.materials.new(img.name)
        rval.texture_slots.add()
        rval.texture_slots[0].texture = tex
        rval.texture_slots[0].texture_coords = 'UV'
        rval.texture_slots[0].uv_layer = 'simple'

    return rval

def makeObjForImage(img, name):
    mesh = makeMeshForImage(img, name)
    obj = bpy.data.objects.new(name, mesh)
    w,h = img.size
    obj.scale = [1.0/w, 1.0/h, 1.0/w]

    mesh.materials.append(material_for(img))

    return obj

img = bpy.data.images["sapling_jungle.png"]
obj = makeObjForImage(img, img.name)
scn = bpy.context.scene
scn.objects.link(obj)
scn.objects.active = obj

Blender python API quick-start

Syntax highlighting by Pygments.