1. --!movie
  2. --!encoding=utf-8
  3.  
  4. -- ************************************************************************
  5. -- Software: BITMAP MEMBER EXPORTER
  6. -- Version:  0.1 - D11.5+ version
  7. -- Date:     2015-08-12
  8. -- Author:   Valentin Schmidt
  9. --
  10. -- Requirements/Dependencies:
  11. -- * Xtra "FileIO"
  12. -- * Xtra "Crypto" (http://valentin.dasdeck.com/xtras/crypto_xtra/win/d11.5/)
  13. -- * Xtra "ImgXtra" (http://valentin.dasdeck.com/xtras/img_xtra/win/)
  14. --
  15. -- Usage:
  16. -- ok = exportBitmap (member("bmp"), _movie.path, "mybitmap")
  17. -- ok = exportBitmap (member("jpg"), _movie.path, void, true)
  18. -- ok = exportBitmap (member("png"), _movie.path, "png", true)
  19. -- ok = exportBitmap (member("png"), _movie.path, "pngasbmp", false)
  20. --
  21. -- ************************************************************************
  22.  
  23. ----------------------------------------
  24. -- Exports internal bitmap member as file. Compressed members are exported in native
  25. -- format (JPG, PNG or GIF), uncompressed members as BMP files (or any other format
  26. -- supported by ImgXtra, see config variable 'uncompressedFileType').
  27. --
  28. -- @param {string} tMemRef
  29. -- @param {string} tFolder
  30. -- @param {string} [tBaseName] - optional, if omitted, memberName is used
  31. -- @param {bool} [tUseCompressed=false] - optional, try to export original compressed media, if available
  32. -- @return {bool} success
  33. ----------------------------------------
  34. on exportBitmap (tMemRef, tFolder, tBaseName, tUseCompressed)
  35.   if tMemRef.type<>#bitmap then return false
  36.   if tMemRef.image.width=0 then return false
  37.  
  38.   -- CONFIG: can be ".bmp" | ".png" | ".jpg" | ".gif"
  39.   uncompressedFileType = ".bmp"
  40.  
  41.   if voidP(tBaseName) then tBaseName = tMemRef.name
  42.   pd = the last char of _movie.path
  43.   if the last char of tFolder<>pd then put pd after tFolder
  44.  
  45.   ok = false
  46.  
  47.   if tUseCompressed then
  48.     tUseCompressed = tMemRef.compressedMedia.length<tMemRef.media.length
  49.       if tUseCompressed then
  50.         data = cx_member_to_bytes(tMemRef, TRUE)
  51.         if data.length>=25 then tUseCompressed = (data[25]>0)
  52.       end if
  53.   end if
  54.  
  55.   if tUseCompressed then
  56.    
  57.     data.position = 29
  58.     formatLen = data[25]
  59.     dataType = data.readRawString(formatLen)
  60.     data.position = data.position+36
  61.    
  62.     case (dataType) of
  63.        
  64.       "kMoaCfFormat_JPEG":
  65.         len = data.readInt32()
  66.         ok = file_put_bytes(tFolder&tBaseName&".jpg", data.readByteArray(len))
  67.        
  68.       "kMoaCfFormat_PNG":
  69.         len = data.readInt32()
  70.         ok = file_put_bytes(tFolder&tBaseName&".png", data.readByteArray(len))
  71.        
  72.       "kMoaCfFormat_GIF":
  73.         len = data.readInt32()
  74.         ok = file_put_bytes(tFolder&tBaseName&".gif", data.readByteArray(len))
  75.  
  76.     end case
  77.   end if
  78.  
  79.   if not(ok) then -- EXPORT AS uncompressedFileType (e.g. BMP)
  80.     ix = xtra("ImgXtra").new()
  81.     props=[:]
  82.     props["image"] = tMemRef.image
  83.     props["filename"] = tFolder&tBaseName&uncompressedFileType
  84.     ok = ix.ix_saveImage(props)
  85.     ix = 0
  86.   end if
  87.  
  88.   return ok
  89.  
  90. end
  91.  
  92. ----------------------------------------
  93. -- Saves byteArray as file
  94. -- @param {string} tFile
  95. -- @param {byteArray} tByteArray
  96. -- @return {bool} success
  97. ----------------------------------------
  98. on file_put_bytes (tFile, tByteArray)
  99.   fp = xtra("fileIO").new()  
  100.   fp.openFile(tFile, 1)
  101.   err = fp.status()
  102.   if (err=0) then fp.delete()
  103.   else if (err <> -37) then return false
  104.   fp.createFile(tFile)
  105.   err = fp.status()
  106.   if (err<>0) then return false
  107.   fp.openFile(tFile, 2)
  108.   err = fp.status()
  109.   if (err<>0) then return false
  110.   ok = fp.writeByteArray(tByteArray)
  111.   fp.closeFile()
  112.   fp = 0
  113.   return (err=0)
  114. end
  115.  
[raw code]