私はテクスチャにブリッジしてKivyに表示する画像データをいくつか持っています。画像データは同じ幅であり、ウィジェットよりも高さが高い。テクスチャが作成された後、スクロール効果のためにyテクスチャをアニメートしたいと思います。blit_bufferとposパラメータを使用してKivyのテクスチャをアニメ化する
以前は、バッファ全体をテクスチャに合わせていたし、ウィジェット自体の位置をアニメートしていました。ただし、バッファデータはGPUのサポートされている最大テクスチャサイズよりも大きい場合があり、画面に何も表示されません。
私は必要なソースバッファのセクションだけをblitし、テクスチャをウィジェットと同じサイズのままにしておく方がよいと考えました。
Kivyのドキュメントを見て、私はposパラメータがあることを発見しました。私はblit_bufferの呼び出しでドキュメントのyposのアニメーション化されたプロパティを使うことができると考えましたが、試してみると何も表示されませんでした。
posパラメータを(0、100)に変更して、パラメータの使用が期待どおりになったかどうかを確認しましたが、それでも表示されませんでした。これを(0、0)に切り替えると、期待どおりに動作します。
blit_buffer()を正しく使用していますか?画像データバッファの一部だけをblitする最良の方法は何ですか?
EDIT:問題はTexture.blit_bufferのPOS引数は()画像データの送信先の座標ではなく、ソースを指定していることだったようです
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.image import Image
from kivy.graphics.texture import Texture
from kivy.graphics import Rectangle
import array
class MyWidget(Widget):
def __init__(self, **kwargs):
super(MyWidget, self).__init__(**kwargs)
texture = Texture.create(size=(512, 512))
buf = [int(x * 255/(512*512*3)) for x in range(512*512*3)]
buf = array.array('B', buf).tostring()
texture.blit_buffer(
buf,
colorfmt='rgb',
bufferfmt='ubyte',
pos=(0, 100)
)
with self.canvas:
Rectangle(texture=texture, pos=self.pos, size=(512, 512))
class MyApp(App):
def build(self):
return MyWidget()
if __name__ == '__main__':
MyApp().run()