用于Python的DXT压缩

时间:2012-06-10 21:46:29

标签: python image compression dxt

我目前正在使用Images并且有些是DXT压缩的,我需要一种使用Python解压缩和压缩这些文件的简单方法。不幸的是,我无法找到任何为我做这件事的图书馆。

有没有人知道一个很好的Python DXT-Compression库,或者一个compresion库的接口?

- dav1d

修改

libsquish是去这里的方式,但不幸的是Python-Bindings不起作用,所以这里是解决方案。

在C ++中创建一个squish-Wrapper,它导出内部访问libsquish的函数:

#include <squish.h>

typedef unsigned char u8;

extern "C" {
    void CompressMasked( u8 const* rgba, int mask, void* block, int flags ) {
        squish::CompressMasked(rgba, mask, block, flags);
    }

    void Compress( u8 const* rgba, void* block, int flags ) {
        squish::Compress(rgba, block, flags);
    }

    void Decompress( u8* rgba, void const* block, int flags ) {
        squish::Decompress(rgba, block, flags);
    }

    int GetStorageRequirements( int width, int height, int flags ) {
        return squish::GetStorageRequirements(width, height, flags);
    }

    void CompressImage( u8 const* rgba, int width, int height, void* blocks, int flags ) {
        squish::CompressImage(rgba, width, height, blocks, flags);
    }

    void DecompressImage( u8* rgba, int width, int height, void const* blocks, int flags ) {
        squish::DecompressImage(rgba, width, height, blocks, flags);
    }
}

创建一个动态库(在Windows上运行dll,或者在Linux上运行,我称之为libsquishc.so)并使用ctypes打开它。

我的方法(只输出我需要的功能):

from ctypes import CDLL, c_int, byref, create_string_buffer
import os.path

libsquish_path = os.path.join(os.path.split(os.path.abspath(__file__))[0], 'libsquishc.so')
libsquish = CDLL(libsquish_path)


DXT1 = 1 << 0 
DXT3 = 1 << 1 
DXT5 = 1 << 2 

COLOR_ITERATIVE_CLUSTER_FIT = 1 << 8    
COLOR_CLUSTER_FIT = 1 << 3    
COLOR_RANGE_FIT = 1 << 4
WEIGHT_COLOR_BY_ALPHA = 1 << 7


GetStorageRequirements = libsquish.GetStorageRequirements
GetStorageRequirements.argtypes = [c_int, c_int, c_int]
GetStorageRequirements.restype = c_int

def compress_image(rgba, width, height, flags):
    rgba = create_string_buffer(rgba)

    c = GetStorageRequirements(width, height, flags)
    buffer = create_string_buffer(c)

    libsquish.Compress(byref(rgba), byref(buffer), c_int(flags))

    return buffer.raw

def decompress_image(block, width, height, flags):
    block = create_string_buffer(block)

    c = width*height*4
    rgba = create_string_buffer(c)

    libsquish.DecompressImage(byref(rgba), c_int(width), c_int(height), byref(block), c_int(flags))

    return rgba.raw

2 个答案:

答案 0 :(得分:1)

libSquisha patch to add Python bindings

编辑:安装程序似乎是

  1. 下载squish-1.11.zip
  2. 解压缩并编译 - 应该生成libsquish.a文件
  3. 下载并安装Cython(听起来就像你这样做了)
  4. 创建一个临时目录并“应用”该补丁 - 它会删除一堆新文件,这些文件是绑定代码
  5. 运行安装程序(sudo python setup.py install)
  6. 如果你这样做但仍然有错误,那么你应该(a)分享实际的错误信息,以便我们找出原因,或者(b)直接联系补丁作者 - mat(at)kivy.org

    编辑2:编译错误很短,我会在此处加入:

    running install
    running build
    running build_ext
    skipping 'squish.c' Cython extension (up-to-date)
    building 'squish' extension
    gcc -pthread -fno-strict-aliasing -march=i686 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -DNDEBUG -march=i686 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2 -fPIC -I.. -I/usr/include/python2.7 -c squish.c -o build/temp.linux-i686-2.7/squish.o
    In file included from squish.c:274:0:
    /usr/include/squish.h:32:1: error: unknown type name 'namespace'
    /usr/include/squish.h:32:18: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
    squish.c: In function '__pyx_pf_6squish_compressImage':
    squish.c:790:22: error: 'squish' undeclared (first use in this function)
    squish.c:790:22: note: each undeclared identifier is reported only once for each function it appears in
    squish.c:790:28: error: expected ';' before ':' token
    squish.c:866:10: error: expected expression before ':' token
    squish.c: In function '__pyx_pf_6squish_2decompressImage':
    squish.c:1202:10: error: expected expression before ':' token
    error: command 'gcc' failed with exit status 1
    

    squish.h的相关部分看起来像

    #ifndef SQUISH_H
    #define SQUISH_H
    
    //! All squish API functions live in this namespace.
    namespace squish {
    
    // -----------------------------------------------------------------------------
    

    并且看起来它在namespace关键字上窒息,我认为这意味着它应该编译为C时编译为C语言。

答案 1 :(得分:0)

libsquish有一些贡献的python绑定:http://code.google.com/p/libsquish/issues/detail?id=17但是我还没有使用它们。