omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    How to load a custom scene Texture?

    Pythonista
    image texture scene
    3
    18
    6106
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Moe
      Moe last edited by

      Thanks for the suggestion, but the image is in the same directory. It is really odd that it does work for you, but not for me.

      I am on iOS 13.5 (17F75) with an iPad 7 and Pythonista 3.3 (330025)

      cvp 2 Replies Last reply Reply Quote 0
      • cvp
        cvp @Moe last edited by

        @Moe same iOS, Pythonista, iPad mini 4, but I did not test with a 32x32 png, I'll do it

        1 Reply Last reply Reply Quote 0
        • cvp
          cvp @Moe last edited by

          @Moe works with a 32x32

          1 Reply Last reply Reply Quote 0
          • cvp
            cvp last edited by

            Try to restart Pythonista

            1 Reply Last reply Reply Quote 0
            • Moe
              Moe last edited by

              After testing with a bigger image (overworld_tileset.png, 565x564 px, 44kb) I got the same result.
              Restarting Pythonista did not help, restarting the iPad did not help.

              cvp 1 Reply Last reply Reply Quote 0
              • cvp
                cvp @Moe last edited by

                @Moe sure you test with the little script, not with a bigger including the little

                1 Reply Last reply Reply Quote 0
                • Moe
                  Moe last edited by

                  I now imported a photo I took with the iPad (JPG) via the little plus in the bottom left -> Import... -> Photo Library and it worked fine!

                  Maybe there is a problem using PNGs?

                  cvp 1 Reply Last reply Reply Quote 0
                  • cvp
                    cvp @Moe last edited by

                    @Moe I'had tried with a png. Could you rename your .jpg as .png and retry

                    1 Reply Last reply Reply Quote 0
                    • Moe
                      Moe last edited by

                      I found the problem: The images I used For testing where saved in P / Indexed Color mode. This can be checked with PIL

                      from PIL import Image
                      
                      img = Image.open('sprite.png')
                      print(img.mode)
                      #> 'P'
                      

                      I converted them with img = img.convert('RGB') and saved them again. Now it works. It seems that the Texture class cannot handle files in mode P and does not fail gracefully. This is probably an oversight.
                      Thank you again @cvp for taking your time to help! Much appreciated.

                      cvp 1 Reply Last reply Reply Quote 0
                      • cvp
                        cvp @Moe last edited by cvp

                        @Moe Nice job! 🍾

                        My tested ping mode was RGBA

                        1 Reply Last reply Reply Quote 0
                        • stephen
                          stephen @Moe last edited by stephen

                          @Moe @cvp

                          You could use io. BytesIO in a Context manager soyou dont need to save and open the images. and when you use ui.Image.from_data(image_data[, scale]) and set scale to your IOS device pixel/point ratio. most comonly 2. (1:1, 2:1, 3:1 ...) this will scale your image properly to the screen. you can get this by calling scene.get_screen_scale()

                          heres an example:

                          import scene
                          import Image
                          import io
                          
                          cache = dict({
                              "img1":"./image1.png",
                              "img2":"./image2.png",
                          })
                          
                          for k,v in cache.items():
                              with Image.open(v) as img:
                                  resized_img=img.resize(
                                      (int(img.size[0]/2), int(img.size[1]/2)), Image.ANTIALIAS)
                                      
                                  with io.BytesIO() as byteStream:
                                      resized_img.save(byteStream, "tiff")    
                                      ns.cache[k]=scene.Texture(ui.Image.from_data(byteStream.getvalue(), scene.get_screen_scale()))
                          
                          
                          1 Reply Last reply Reply Quote 0
                          • stephen
                            stephen @cvp last edited by ccc

                            @cvp said:

                            @Moe sure that sprite.png in the same folder as your script? For me, it is ok

                            import ui, scene
                            image = ui.Image('sprite.png')
                            image.show()   												# this works
                            texture = scene.Texture(image) 				# this works
                            texture = scene.Texture('sprite.png') # this works
                            

                            from my understanding shoudn't it be ui.Image.named('sprite.png')

                            cvp 1 Reply Last reply Reply Quote 0
                            • cvp
                              cvp @stephen last edited by

                              @stephen said:

                              from my understanding shoudn't it be ui.Image.named('sprite.png')

                              You're right but try it, it works also without .named

                              stephen 1 Reply Last reply Reply Quote 1
                              • stephen
                                stephen @cvp last edited by

                                @cvp

                                well look at that... i think its all beena lie... lol jk but i do wonder what the method named might be doing that may be a benefit?

                                cvp 1 Reply Last reply Reply Quote 0
                                • cvp
                                  cvp @stephen last edited by

                                  @stephen said:

                                  what the method named might be doing that may be a benefit?

                                  No idea

                                  1 Reply Last reply Reply Quote 0
                                  • Moe
                                    Moe last edited by

                                    My current approach is to load the tileset.png which contains all the tiles. I then use Image.crop() for every tile I want to extract. I then upscale them using Image.resize() by some arbitrary factor, because if I would let the scene upscale the 8x8 textures to something like 64x64, the performance drops hard. Using BytesIO I convert them to ui.Image without saving them on disk and from there I can load them as a scene.Texture.

                                    But thank you for the hint that I can load the image and scale them in one operation!

                                    All I had to do to fix the original problem was converting the tileset.png to RGB mode.

                                    1 Reply Last reply Reply Quote 1
                                    • First post
                                      Last post
                                    Powered by NodeBB Forums | Contributors