LINUX.ORG.RU

дайте примерчик работы с offset'ом бинарника


0

0

Нашел кучу примеров в разных прогах по имедж рендерингу, но все как-то
 много там. Может есть что-нибуть попроще, покороче, мне нужно
 ширину\длину изображения узнать и выдернуть сам HEX код самой картинки.
anonymous

ImageMagick?

anonymous
()

читалку bmp, gif, png, jpeg etc. можно написать руками... вопрос нужно ли, если полно готовых библиотек как для работы с указанными форматами файлов, так и просто "для работы с рисунками" (e.g. ImageMagick).

svr4
()

Вдогонку: телепаты из отпуска пока так и не вернулись, так что формулируйте вопросы конкретнее...

svr4
()
Ответ на: комментарий от svr4

У меня есть вот такой для того что-бы узнать длину\ширину, но это под гномовый гтк, а мне нужно просто, без х, толко смд... и как можно проще. Если не затруднит, поделитесь каким-нибуть универсальным, про jpeg в курсе, там куча разных форматов, пробовал юзать 
для джепега делал так...

long Mult(unsigned char lsb, unsigned char msb){
    return (lsb + (msb * 256) );
int main(int argc, char **argv, int Width, int Height){
	char pbData[256];
//потом узнал что это именно джепег...
//только вот с оффсетом не совсем понял, по идее по 4 значения на ширину и высоту, а у меня всего четыре
Height = Mult(pbData[b], pbData[c]); 
Width = Mult(pbData[d], pbData[e]); 
//ну и в итоге у меня не те данные выводятся
printf("Height: %d\r\n", Height);


а вот тот сырец для гиф, по под гтк, нужно что-то универсальное для gif, tiff, bmp, иботам нет таких извратов как в джепеге.
static gint ett_gif = -1;
static gint ett_global_flags = -1;
static gint ett_local_flags = -1;
static gint ett_extension = -1;
static gint ett_image = -1;
static void dissect_gif(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
void proto_register_gif(void);
static void dissect_gif(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree){
	proto_item *ti;
	proto_tree *gif_tree;
	proto_tree *subtree; 
	guint offset = 0, len = 0;
	guint8 peek;
	guint tvb_len = tvb_reported_length(tvb);
	char *str = tvb_get_ephemeral_string(tvb, 0, 6);
	if (tree) {
		ti = proto_tree_add_item(tree, proto_gif, tvb, 0, -1, TRUE);
		gif_tree = proto_item_add_subtree(ti, ett_gif);
		offset = 13 + len;
		while (offset < tvb_len) {peek = tvb_get_guint8(tvb, offset);
			 if (peek == 0x2C) {
				guint32 item_len = 11;
				ti = proto_tree_add_item(gif_tree, hf_image, tvb, offset, 1, TRUE);
				subtree = proto_item_add_subtree(ti, ett_image);
				offset++;
				proto_tree_add_item(subtree, hf_image_width, tvb, offset, 2, TRUE); offset += 2;
				proto_tree_add_item(subtree, hf_image_height, tvb, offset, 2, TRUE); offset += 2;
			} else {
				proto_tree_add_item(gif_tree, hf_trailer, tvb, offset, 1, TRUE);
				break;
			}
		} /* while */
	}
}

anonymous
()
Ответ на: комментарий от anonymous

Пример из DevIL:

// Required include files.
#include <IL/il.h>
#include <IL/ilu.h>
#include <stdio.h>

int main(int argc, char **argv)
{
        ILuint  ImgId;
        ILenum  Error;

        // We use the filename specified in the first argument of the command-line.
        if (argc < 2) {
                fprintf(stderr, "DevIL_test : DevIL simple command line application.\n");
                fprintf(stderr, "Usage : DevIL_test <file> [output]\n");
                fprintf(stderr, "Default output is test.tga\n");
                return 1;
        }

        // Check if the shared lib's version matches the executable's version.
        if (ilGetInteger(IL_VERSION_NUM) < IL_VERSION ||
                iluGetInteger(ILU_VERSION_NUM) < ILU_VERSION) {
                printf("DevIL version is different...exiting!\n");
                return 2;
        }

        // Initialize DevIL.
        ilInit();

        // Generate the main image name to use.
        ilGenImages(1, &ImgId);

        // Bind this image name.
        ilBindImage(ImgId);

        // Loads the image specified by File into the image named by ImgId.
        if (!ilLoadImage(argv[1])) {
                printf("Could not open file...exiting.\n");
                return 3;
        }

        // Display the image's dimensions to the end user.
        printf("Width: %d  Height: %d  Depth: %d  Bpp: %d\n",
               ilGetInteger(IL_IMAGE_WIDTH),
               ilGetInteger(IL_IMAGE_HEIGHT),
               ilGetInteger(IL_IMAGE_DEPTH),
               ilGetInteger(IL_IMAGE_BITS_PER_PIXEL));

        // Enable this to let us overwrite the destination file if it already exists.
        ilEnable(IL_FILE_OVERWRITE);

        // If argv[2] is present, we save to this filename, else we save to test.tga.
        if (argc > 2)
                ilSaveImage(argv[2]);
        else
                ilSaveImage("test.tga");

        // We're done with the image, so let's delete it.
        ilDeleteImages(1, &ImgId);

        // Simple Error detection loop that displays the Error to the user in a human-readable form.
        while ((Error = ilGetError())) {
                printf("Error: %s\n", iluErrorString(Error));
        }

        return 0;

}

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

ок, а теперь подскажите, почему нельзя вот так? Т.е. так можно, но 
значения получаются не те что ожидаются.
int fd = open("/path/to/file", O_RDONLY);
char val1, val2;
if (fd >= 0) {
    lseek(fd, 0x6, SEEK_SET);
    read(fd, &val1, sizeof(val1));
    lseek(fd, 0x8, SEEK_SET);
    read(fd, &val2, sizeof(val2));
    close(fd);
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.