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.
    • 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