2017-07-31 68 views
0

我有一些圖像數據,我blitting到紋理,並顯示在基維。圖像數據寬度相同,比窗口部件高。紋理創建完成後,我想爲其滾動效果設置動畫的y位置。在基維使用blit_buffer和pos參數設置動畫紋理

在此之前,我已經將整個緩衝區佈告到紋理中,併爲小部件本身的位置製作動畫。但是,緩衝區數據有時會大於我的GPU支持的最大紋理尺寸,並且屏幕上不顯示任何內容。

我想一個更好的方法是僅將我需要的源緩衝區的部分blit,並保留與部件相同大小的紋理。

在查看了Kivy的文檔後,我發現有一個pos參數。我想我可以在調用blit_buffer時使用文件ypos的動畫屬性,但是當我嘗試它時,沒有再顯示。

我將pos參數切換到(0,100),以查看我的參數使用是否符合我的預期,但仍未顯示。切換到(0,0)按預期工作。

我正確使用blit_buffer()嗎?只有一部分圖像數據緩衝區溢出的最佳方式是什麼?

編輯:我重新就此問題與一個獨立的腳本:

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() 

回答

0

看來問題是Texture.blit_buffer()的pos參數指定圖像數據的目的地座標,而不是源座標。

我最終通過使用PIL來裁剪圖像數據來解決我的問題,然後創建一個包含多個貼圖的貼圖渲染器,每個貼圖都適合。