Żadne z tych narzędzi nie spełniało moich wymagań, więc napisałem takie, które wykorzystuje niewielką bibliotekę obrazów Marka Tylersa, mtpixel (obecnie część mtcelledit ) jest ono bardzo rozbudowane, ale można je łatwo rozszerzyć za pomocą wbudowanych funkcji mtpixel, które obejmują: skalę szarości, odwrócenie kolorów , obrót, wyostrzanie, kwantyzacja, posteryzacja, przerzucanie (w pionie i poziomie), transformacja, rgb-> indeksowane, indeksowane-> rgb, wykrywanie krawędzi, wytłaczanie, rysowanie wielokątów, tekst i więcej.
Wszystko, co musisz zrobić, to przekazać mu zestaw obrazów jako argumenty (obsługuje png, gif i jpeg), a wyprowadzi plik rgb png o nazwie sprite.png wraz z przydatnymi danymi dotyczącymi cięcia obrazu na standardowe wyjście. Używam go w skryptach bash, aby spryskać cały katalog obrazów i wyprowadzić dane dotyczące wycinania w celu automatycznego generowania css (z nadzieją, że w końcu uda mi się automatycznie zastąpić istniejące tagi img odrobiną kreatywnego sed / awk)
Pakiety binarne dla szczeniaka linux będą tutaj:
http://murga-linux.com/puppy/viewtopic.php?t=82009
Mój przypadek użycia wymagał jedynie łączenia obrazów w pionie w nowy plik png, więc to wszystko, co robi, ale mój kod źródłowy jest własnością publiczną, a biblioteka mtcelledit to gpl3. Z statycznie połączonym mtpixel, plik binarny ma <100kb (tylko kilka kb, gdy jest połączony dynamicznie), a jedynymi innymi zależnościami są libpng, libjpeg i libgif (i freetype z oficjalnym mtpixel, ale nie potrzebowałem obsługi tekstu, więc ja zakomentował bity typu freetype w kompilacji statycznej)
możesz dowolnie modyfikować na własne potrzeby:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mtpixel.h>
int main( int argc, char *argv[] ){
int i=0,height=0,width=0,y=0;
mtpixel_init();
mtImage *imglist[argc];
argc--;
do{ imglist[i] = mtpixel_image_load( argv[i+1] );
height+=imglist[i]->height;
if (imglist[i]->width > width) width=imglist[i]->width;
} while (++i < argc);
imglist[argc]=mtpixel_image_new_rgb(width,height);
imglist[argc]->palette.trans=0;
i=0;
do{ if (imglist[i]->type == MTPIXEL_IMAGE_INDEXED)
mtpixel_image_paste(imglist[argc],mtpixel_image_to_rgb(imglist[i]),mtpixel_brush_new(),0 ,y);
else mtpixel_image_paste(imglist[argc],imglist[i],mtpixel_brush_new(),0 ,y);
printf("name=%s;width=%d;height=%d;y_offset=%d\n",argv[i+1],imglist[i]->height,imglist[i]->width,y);
y+=imglist[i]->height;
mtpixel_image_destroy( imglist[i] );
}while (++i < argc);
mtpixel_image_save( imglist[argc], "sprite.png", MTPIXEL_FILE_TYPE_PNG, 5 );
mtpixel_quit();
return 0;
}