On Oct 3, 11:56 pm, Peter Otten <__pete...@web.de> wrote: > Martin wrote: > > Dear group > > > I'm trying to use PIL to write an array (a NumPy array to be exact) to > > an image. > > Peace of cake, but it comes out looking strange. > > > I use the below mini code, that I wrote for the purpose. The print of > > a looks like expected: > > > [[ 200. 200. 200. ..., 0. 0. 0.] > > [ 200. 200. 200. ..., 0. 0. 0.] > > [ 200. 200. 200. ..., 0. 0. 0.] > > ..., > > [ 0. 0. 0. ..., 200. 200. 200.] > > [ 0. 0. 0. ..., 200. 200. 200.] > > [ 0. 0. 0. ..., 200. 200. 200.]] > > > But the image looks nothing like that. > > > Please see the images on: > >http://hvidberg.net/Martin/temp/quat_col.png > >http://hvidberg.net/Martin/temp/quat_bw.png > > > or run the code to see them locally. > > > Please – what do I do wrong in the PIL part ??? > > > :-? Martin > > > import numpy as np > > from PIL import Image > > from PIL import ImageOps > > > maxcol = 100 > > maxrow = 100 > > > a = np.zeros((maxcol,maxrow),float) > > > for i in range(maxcol): > > for j in range(maxrow): > > if (i<(maxcol/2) and j<(maxrow/2)) or (i>=(maxcol/2) and j>= > > (maxrow/2)): > > a[i,j] = 200 > > else: > > a[i,j] = 0 > > > print a > > > pilImage = Image.fromarray(a,'RGB') > > pilImage.save('quat_col.png') > > pilImage = ImageOps.grayscale(pilImage) > > pilImage.save('quat_bw.png') > > The PIL seems to copy the array contents directly from memory without any > conversions or sanity check. In your example The float values determine the > gray value of 8 consecutive pixels. > > If you want a[i,j] to become the color of the pixel (i, j) you have to use > an array with a memory layout that is compatible to the Image. > Here are a few examples: > > >>> import numpy > >>> from PIL import Image > >>> a = numpy.zeros((100, 100), numpy.uint8) > >>> a[:50, :50] = a[50:, 50:] = 255 > >>> Image.fromarray(a).save("tmp1.png") > >>> b = numpy.zeros((100, 100, 3), numpy.uint8) > >>> b[:50, :50, :] = b[50:, 50:, :] = [255, 0, 0] > >>> Image.fromarray(b).save("tmp2.png") > >>> c = numpy.zeros((100, 100), numpy.uint32) > >>> c[:50, :50] = c[50:, 50:] = 0xff808000 > >>> Image.fromarray(c, "RGBA").save("tmp3.png") > > Peter
Thanks All - That helped a lot... The working code ended with: imga = np.zeros((imgL.shape[1],imgL.shape[0]),np.uint8) for ro in range(imgL.shape[1]): for co in range(imgL.shape[0]): imga[ro,co] = imgL[ro,co] Image.fromarray(imga).save('_a'+str(lev)+'.png') -- http://mail.python.org/mailman/listinfo/python-list