2019年6月10日 星期一

從Blender裡萃取模組資料(9)

從Blender裡萃取模組資料(9)

前言

  最近匯出模組時發現沒 Texture 很不方便,所以就來研究如何取得 Texture 的資料,在五做個紀錄。

內容

  萃取Texture的資料意外的簡單,看以下範例
import bpy
tagObj = bpy.data.objects['Cube']
if tagObj.active_material != None:
    for curTexSlot in tagObj.active_material.texture_slots:
        if curTexSlot == None or curTexSlot.use!=True:
            continue
        #
        if curTexSlot.texture.type != 'IMAGE':
            continue
        #
        print('Slot name:',curTexSlot.name) 
        print('Image name:',curTexSlot.texture.image.name) 
        print('Image width:',curTexSlot.texture.image.size[0])
        print('Image height:',curTexSlot.texture.image.size[1])
        print('Image format:',curTexSlot.texture.image.file_format)
        print('Image path:',curTexSlot.texture.image.filepath_from_user() )
        #Pixel data
        print('Image pixel data amount:',len(curTexSlot.texture.image.pixels) )
        
        

範例先檢查是否有 Material 的資料,接著會取 texture_slots,預設會有18個,要注意 slot 可能事空的,範例有過濾該 Texture 是否是使用中,這點可依據需要來取捨。接下來是檢查 Texture 的 type ,範例指讀取 Image 的型態,這個檢查是"必要"的,當 type 是 Image 時, texture.image 才會有資料。資料對應編輯器的顯示可以參考下圖
資料對應編輯器的顯示

width 與 height 很直覺的就在 image 的 size, format 會顯示 Blender 支援的圖片格式,範例的話這個數值會是 PNG ,在官網 Blender Documentation Contents 的解說如下

file_format¶
Format used for re-saving this file

BMP BMP, Output image in bitmap format.
IRIS Iris, Output image in (old!) SGI IRIS format.
PNG PNG, Output image in PNG format.
JPEG JPEG, Output image in JPEG format.
JPEG2000 JPEG 2000, Output image in JPEG 2000 format.
TARGA Targa, Output image in Targa format.
TARGA_RAW Targa Raw, Output image in uncompressed Targa format.
CINEON Cineon, Output image in Cineon format.
DPX DPX, Output image in DPX format.
OPEN_EXR_MULTILAYER OpenEXR MultiLayer, Output image in multilayer OpenEXR format.
OPEN_EXR OpenEXR, Output image in OpenEXR format.
HDR Radiance HDR, Output image in Radiance HDR format.
TIFF TIFF, Output image in TIFF format.
AVI_JPEG AVI JPEG, Output video in AVI JPEG format.
AVI_RAW AVI Raw, Output video in AVI Raw format.
FRAMESERVER Frame Server, Output image to a frameserver.
H264 H.264, Output video in H.264 format.
FFMPEG MPEG, Output video in MPEG format.
THEORA Ogg Theora, Output video in Ogg format.
XVID Xvid, Output video in Xvid format.

路徑的部分透過 filepath_from_user() 來取得,取得後會是"絕對路徑",如果透過 filepath 或 filepath_raw 這兩個 Property取得會得到 Blender定義的路徑(範例的數值是 //color.png ),就我個人的需求來這個是數值目前用不到,所以範例只展示了使用"絕對路徑",有了"絕對路徑"就可以讀檔將檔案的資料直接讀出,這也是匯出會把整張圖匯到檔案理會需要的。最後會看到 pixels 這個 Property ,這個 Property 可以直接取得 Pixel 的資料,資料的型態是 List ,每個資料都是 float ,資料排列的方式是從"左下"座標為基準排列 Piexl 的資料,如果習慣用"左上"排列,記得做上下要顛倒的處理,每個 Pixel 的組成是4個float,依據 RGBA 的順序來排列。 pixels 這個 Property 我最後並沒有用到,就像之前說的,有絕對路徑就符合需求了,單純只是研究用。

2021/03/29 修正:
  由於 Blender 2.8 以後的 Material 有更動,上述方法不再適用,可以參考 從Blender裡萃取模組資料(11)

參考資料

Blender Documentation Contents

相關文章

從Blender裡萃取模組資料(8)

沒有留言:

張貼留言