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 @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