Жоден із цих інструментів не відповідав моїм вимогам, тому я написав той, який використовує крихітну бібліотеку зображень Марка Тайлерса, mtpixel (тепер це частина mtcelledit ). Це не надто обширно, але легко розширюється завдяки вбудованим функціям mtpixel, які включають: масштабність сірого, інверсія кольорів , обертання, загострення, квантування, постеризація, фліп (вертикальний і горизонтальний), перетворення, rgb-> індексований, індексований-> rgb, виявлення краю, тиснення, малювання багатокутників, текст тощо.
Все, що вам потрібно зробити, - це передавати йому набір зображень у вигляді аргументів (підтримує png, gif та jpeg), і він виведе rgb png під назвою sprite.png разом з корисними даними нарізки зображення для stdout. Я використовую його в bash-скриптах, щоб справити цілий каталог зображень і вивести дані нарізки для автоматичного генерування css (з надією зрештою зробити це здатним автоматично замінити існуючі теги img автоматично з трохи творчого sed / awk)
Бінарні пакети для щенячого Linux будуть тут:
http://murga-linux.com/puppy/viewtopic.php?t=82009
Мій випадок використання вимагав лише сплайсування зображень вертикально на новий png, так що це все, але це мій вихідний код - публічне надбання, а бібліотека mtcelledit - gpl3. Якщо статично пов'язаний mtpixel, двійковий код становить <100 кбіт (лише кілька кб при динамічному зв’язку), а єдиними іншими залежностями є libpng, libjpeg і libgif (і вільний тип з офіційним mtpixel, але мені текстова підтримка не потрібна, тому мені прокоментував біти вільної форми в статичній збірці)
сміливо змінюйте для власних потреб:
#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;
}