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

      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