Index: pyglet/image/__init__.py
===================================================================
--- pyglet/image/__init__.py	(revision 2425)
+++ pyglet/image/__init__.py	(working copy)
@@ -148,6 +148,17 @@
 
 from pyglet.image import atlas
 
+_opengl_ctypes = {
+    gl.GL_BYTE: gl.GLbyte,
+    gl.GL_UNSIGNED_BYTE: gl.GLubyte,
+    gl.GL_SHORT: gl.GLshort,
+    gl.GL_UNSIGNED_SHORT: gl.GLushort,
+    gl.GL_INT: gl.GLint,
+    gl.GL_UNSIGNED_INT: gl.GLuint,
+    gl.GL_FLOAT: gl.GLfloat,
+    gl.GL_DOUBLE: gl.GLdouble,
+    }
+
 class ImageException(Exception):
     pass
 
@@ -782,8 +793,10 @@
         :rtype: cls or cls.region_class
         '''
         internalformat = self._get_internalformat(self.format)
-        texture = cls.create(self.width, self.height, internalformat, 
-                             rectangle, force_rectangle)
+        texture = cls.create(self.width, self.height,
+                             internalformat=internalformat,
+                             rectangle=rectangle,
+                             force_rectangle=force_rectangle)
         if self.anchor_x or self.anchor_y:
             texture.anchor_x = self.anchor_x
             texture.anchor_y = self.anchor_y
@@ -796,9 +809,10 @@
     def get_texture(self, rectangle=False, force_rectangle=False):
         if (not self._current_texture or 
             (not self._current_texture._is_rectangle and force_rectangle)):
-            self._current_texture = self.create_texture(Texture, 
-                                                        rectangle,
-                                                        force_rectangle)
+            self._current_texture = self.create_texture(
+                Texture,
+                rectangle=rectangle,
+                force_rectangle=force_rectangle)
         return self._current_texture
 
     def get_mipmapped_texture(self):
@@ -1420,7 +1434,8 @@
             pass
 
     @classmethod
-    def create(cls, width, height, internalformat=GL_RGBA, 
+    def create(cls, width, height,
+               format=GL_RGBA, dtype=GL_UNSIGNED_BYTE, internalformat=GL_RGBA,
                rectangle=False, force_rectangle=False):
         '''Create an empty Texture.
 
@@ -1434,9 +1449,19 @@
                 Width of the texture.
             `height` : int
                 Height of the texture.
+            `format` : int
+                Format of the texture image data.  One of
+                ``GL_COLOR_INDEX``, ``GL_DEPTH_COMPONENT``, ``GL_RGB``,
+                ``GL_RGBA``, ``GL_RED``, ``GL_GREEN``, ``GL_BLUE``,
+                ``GL_ALPHA``, ``GL_LUMINANCE``, or ``GL_LUMINANCE_ALPHA``.
+            `dtype` : int
+                GL constant describing the underlying data-type of the
+                texture, e.g. ``GL_UNSIGNED_BYTE`` or ``GL_FLOAT``.
             `internalformat` : int
-                GL constant giving the internal format of the texture; for
-                example, ``GL_RGBA``.
+                GL constant giving the internal bit-format of the
+                texture; for example, ``GL_R3_G3_B2``.  This is a
+                recommendation to OpenGL, but will not necessarily be
+                followed.
             `rectangle` : bool
                 ``True`` if a rectangular texture is permitted.  See
                 `AbstractImage.get_texture`.
@@ -1478,12 +1503,24 @@
         glBindTexture(target, id.value)
         glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
 
-        blank = (GLubyte * (texture_width * texture_height * 4))()
+        colour_bands = {GL_COLOR_INDEX: 1,
+                        GL_DEPTH_COMPONENT: 1,
+                        GL_RGB: 3,
+                        GL_RGBA: 4,
+                        GL_RED: 1,
+                        GL_GREEN: 1,
+                        GL_BLUE: 1,
+                        GL_ALPHA: 1,
+                        GL_LUMINANCE: 1,
+                        GL_LUMINANCE_ALPHA: 2}
+
+        blank = (_opengl_ctypes[dtype] * \
+                 (texture_width * texture_height * colour_bands[format]))()
         glTexImage2D(target, 0,
                      internalformat,
                      texture_width, texture_height,
                      0,
-                     GL_RGBA, GL_UNSIGNED_BYTE,
+                     format, dtype,
                      blank)
 
         texture = cls(texture_width, texture_height, target, id.value)
