LG.BALUKATION's Weblog

Ничего, это тоже кое-что… А при желании из него можно сделать что угодно

GIMP RGB C-Source image dump

Posted by LG.BALUKATION на 2008/02/24

Около пяти лет назад я впервые познакомился с the GNU Image Manipulation Program. В те годы я читал журнал «Chip» и в одном из выпусков там был обзор windows-порта сей замечательной программы. Прога меня заинтересовала и было решено поставить да самому глянуть каг оно (1.* for Windows).

Я не художник и вобще далёк от обработки графики, но с тех пор я временами пользуюсь GIMP’ом по мере необходимости. Переход с PhotoShop был очень простым и безболезненным, т. к. я не умел толком юзать фотожоп, мне нах не нужна куча его фич, а объём прожки для обработки графики в одну болванку для меня тогда показался пустой тратой места. К томуж я считаю просто убогой мысль воротить кучу дочерних окон в одном родительском — в этом плане фейс GIMP’а меня приятно порадовал.

Среди интересных особенностей GIMP’а была, мной отмечена возможность сохранить картинку как сырец. Правда до этого дня меня у меня чё-то не доходили руки чтоб глянуть каг оно пашет, но вот сегодня я решил всёж посмотреть это дело.

В качестве изображения для извращений было выбрано милое зверушко с главной страницы проекта Frenzy. И так, открываем, сохраняем как *.c исходник и… А как читать-то?

Чисто с виду имеется некая структура с большим бинарником и парой полей описания. Но чёт я задумался на тему формата этого бинарника и решил почитать на эту тему. Вот тока почитать на вики и оф. сайте GIMP ничего не нашлось, пошёл гуглить…

Откопал архив переписки с примером кода. Посмотрел — вроде ничего сложного. Скомпилил, запустил, работает… но не правильно :-?

Решил переписать малёк. В общем фича оказалась в порядке цветов (пришлось менять красный и синий каналы местами) и я малость поменял создание поверхности для отображения — архив старый, сейчас про такие функции ни в man’ах ни в оф. документации упоминаний уже нет.

Makefile я всяз от своей другой SDL-прожки и упростил его счутка, так что не удивляйтесь некоторым его странностям (так же там стоит оптимизация под мой процессор — если у вас другой, измените значение march или вообще уберите эту опцию компилятора).

TARGET = hz
LIBS = `sdl-config --libs` -I/usr/include/GL -lGL -lGLU
CFLAGS = -march=athlon64 -O3 -Wall -pedantic `sdl-config --cflags`
CC = g++

all: hz.o
	$(CC) -o $(TARGET) hz.o $(LIBS)
	strip $(TARGET)

hz.o: hz.cpp
	$(CC) $(CFLAGS) -c hz.cpp -o hz.o

clean:
	rm hz.o
	rm $(TARGET)

Немного изменённый мной исходник:

#include <stdio.h>
#include "SDL.h"

/* Include the GIMP created image */
#include "gimp_image.c"

int main()
{
	SDL_Surface *screen, *image;

	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
		fprintf(stderr, "Couldn't init SDL: %s\n", SDL_GetError());
		exit(1);
	}
	atexit(SDL_Quit);

	screen = SDL_SetVideoMode(gimp_image.width, gimp_image.height, 0, 0);
	if ( screen == NULL ) {
		fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError());
		exit(1);
	}

	/* Exchanging Blue and Red channels */
	char temp;
	for (unsigned int i = 0; i < sizeof(gimp_image.pixel_data); i += gimp_image.bytes_per_pixel)
	{
		temp = gimp_image.pixel_data&#91;i&#93;;
		gimp_image.pixel_data&#91;i&#93; = gimp_image.pixel_data&#91;i+2&#93;;
		gimp_image.pixel_data&#91;i+2&#93; = temp;
	}

	/* A sneaky way of getting our image in a format SDL can use */
	image = SDL_CreateRGBSurfaceFrom(
		(void *)gimp_image.pixel_data,
		gimp_image.width,
		gimp_image.height,
		gimp_image.bytes_per_pixel * 8,
		gimp_image.width * gimp_image.bytes_per_pixel,
		0, 0, 0, 0);

	if ( image == NULL ) {
		fprintf(stderr, "Couldn't create image: %s\n", SDL_GetError());
		exit(1);
	}

	/* Show the image */
	SDL_BlitSurface(image, NULL, screen, NULL);
	SDL_UpdateRect(screen, 0, 0, 0, 0);

	/* Wait for a keystroke or quit request */
	while ( ! SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT,
				SDL_KEYDOWNMASK|SDL_QUITMASK) ) {
		SDL_Delay(100);
		SDL_PumpEvents();
	}

	/* Free the gimp image
	   - be sure to set pixels NULL so SDL doesn't free them!
	 */
	image->pixels = NULL;
	SDL_FreeSurface(image);

	/* We're outta here! */
	exit(0);
}

Поидее тут ещё должна быть картинка, но сей код оказался слишком суровым для SeaMonkey и Opera, да так что они тупа висли =) links правда всё шикарн отображал, но я решил всёж порезать пост — кому интересно сами сохранят файл как сырец — благо это не сложно.

Реклама

комментариев 5 to “GIMP RGB C-Source image dump”

  1. D_Alex said

    # /* We’re outta here! */
    # exit(0);

    порадовало =)

  2. D_Alex said

    и это
    TARGET = hz
    тоже =))

  3. Саша, комменты в коде оригинальные. я тока каналы перекинул.

    про hz — у меня эт стандартная штук, есть ещё куча недопрог с названием lol =)

  4. Igor said

    да всё висло нафиг, непонятно только почему. Быдлокод получился, что ли =/
    Ты файл-то не приложил. «gimp-image.c», или я пропустил?

  5. Удалил файл и всё перестало виснуть. Прикладывать смысла не вижу — открой любой и сохрани как сырец, вот те и картинка. Тока я вырубил юзание типов Glib, т.к. эту библиатеку не инклудил.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s