Trouble using imported images from Photos
I am currently teaching some young kids to code using Pythonista, our current project is Pac Man. As the kids are young I am having to take some shortcuts. For instance instead of building the background with tiles, I just want to load it from an image.
So I have saved some images from the internet and am attempting to load them into my Scene as a SpriteNode. I can import them into Pythonista without any issue, however when I try to use them in the code I get strange errors. Sometime it is ‘could not load image’, but other times it gives errors on future lines, such as if you forget a semi colon.
My image is in the same folder as the code, and I have tried lots of different images. One time one image worked, so I deleted it and tried again (need to ensure it works for kids) and it failed.
I am on iOS11 with the latest version of Pythonista. Has anybody ne experienced this issue or have an ideas?
from scene import *
from joystick import Joystick
from player import Player
from tile import Tile
from direction import Direction
A = Action
class MyScene (Scene):
self.background_color = '#000000' self.background = SpriteNode('IMG_0204.PNG') self.background.position = self.size.width / 2, self.size.height / 2 self.add_child(self.background)
import ui from scene import * class MyScene (Scene): def setup(self): self.background_color = '#000000' ui_image = ui.Image.named('IMG_5903.JPG') # 5 MB 3672x4896 px **** Error #ui_image = ui.Image.named('IMG_3735.JPG') # 4 MB 1536x2048 px **** ok #ui_image = ui.Image.named('IMG_6575.JPG') # 43 KB 640x853 px **** ok self.background = SpriteNode(ui_image) self.background.position = self.size.width / 2, self.size.height / 2 self.add_child(self.background) run(MyScene())
No error with photo of 4 Mb but error with photo of 5 Mb
what if you create the SpriteNode outside of the scene?
ohh, ok. scene Textures are opengl based, i think. So you cannot have a Texture that is larger in pixels that the graphics memory region, which is something like twice largest screen size (for retina displays).
with ui.ImageContext(1024*2,1024*2) as ctx: #ui.Image.named('IMG_0625.JPG').draw() Texture(ctx.get_image())
The above works, on my Ipad3. Anything up to 2048 in either row/col works, but even 2049x1 fails. so, that tells me the opengl textures must be <=2048 in either dimension.
I‘m having a somewhat similar issue, I can’t even load an image that’s 511 kB in size. I haven’t used the scene module for some time now and my memory is a bit rusty, but the following code should run without an issue, right?
Here it is:
from scene import * import os A = Action class MyScene (Scene): def setup(self): img = 'rectangle_1.png' self.background_color = 'white' if img in os.listdir(): print('yes') #prints 'yes' in console print(ui.Image.named('IMG_5903.JPG')) #prints None in console #a = Texture(img) #Image not found a = SpriteNode(img) #could not load texture self.add_child(a) pass if __name__ == '__main__': run(MyScene(), show_fps=False)
Wouldn’t you need an
img = 'rectangle_1.png' self.background_color = 'white' if img in os.listdir(): print('yes') printt(ui.Image.named(img))
You were checking one file, but trying to open a different one
@pulbrich no, it actually functions. The output is the same if I use “import ui” and when I don’t.
@JonB your suggestion prints the following:
<_ui.Image object at 0x108fe9e40>
I figured out the issue. Whenever I import an image from my camera roll, it’s ending is in caps (.PNG). Renaming it to .png causes the issue, so I’m just going to not do that :)