2012-06-10 2 views
2

В настоящее время я работаю с изображениями, а некоторые сжаты DXT, мне нужен простой способ распаковки и сжатия этих файлов с помощью Python. К сожалению, мне не удалось найти библиотеку, которая сделает это для меня.DXT Compression for Python

Кто-нибудь знает хорошую библиотеку DXT-Compression для Python или интерфейс библиотеки compresion?

- dav1d

Edit:

libsquish был путь здесь, но несчастливо Питон-Наручники не работают, так что здесь решение.

Сделать хлюпать-обертку в C++, который экспортирует функции, которые внутренне 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); 
    } 
} 

Создать динамическую библиотеку (библиотеку 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 

ответ

1

libSquish имеет a patch to add Python bindings.

Edit: процедура Установка, кажется

  1. скачать squish-1.11.zip
  2. распаковку и компилировать - должно привести к libsquish.a файл
  3. скачать и установить Cython (звучит, как вы делали это)
  4. создайте временный каталог и примените патч - он удаляет кучу новых файлов, которые являются обязательным кодом
  5. запустите установку (Судо питон setup.py установки)

Если вы сделали это и до сих пор есть ошибки, то возможно, вы должны (а) разделить фактические сообщения об ошибках, чтобы мы могли понять, почему, или (б) контакт патч автор непосредственно - мат (в) kivy.org

Edit2: ошибка компиляции является достаточно коротким, что я буду включать его здесь:

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++.

+0

Спасибо, пожалуйста, взгляните на комментарий от xioxox. – dav1d

+0

Ошибка, которую я получаю: https://gist.github.com/8d0341f5f5441426f5b4 – dav1d

+0

Спасибо за ваши усилия, и libsquish был правильным намеком, я приму этот ответ, и я отредактирую свой вопрос и объясню, как я это сделал. – dav1d

0

libsquish имеет некоторые способствовали питона привязок: http://code.google.com/p/libsquish/issues/detail?id=17 Я не использовал их, однако.

+0

Спасибо! Я попробовал их, и к несчастью, они не работают. Я установил Cython2 (Archlinux-Package) и попытался использовать setup.py, но компилятор дал мне ошибки. – dav1d