LINUX.ORG.RU

Вопрос по оцифровке фотографий


0

0

Народ, а подскажите пожалуйста, чем на Linux можно оцифровать фотографию, чтобы получить из неё простую таблицу вида:

x y R G B

По сути дела, нужно из фотографии сделать 3D plot (что-то типа вот этого оффтопа: http://www.imagedig.com/page7.html).

Вообще-то, 3D я и сам нарисую, но КАК из картинки данные вытащить??? garry * (*) (14.07.2008 6:37:15)


Небольшой программкой на сях с использованием libjpeg или libpng, это займет вечер, даже ели в этими либами никогда раньше не работал.

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

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

vlIlich
()

//gluk.c
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to retrieve */
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

    switch(bpp) {
    case 1:
        return *p;

    case 2:
        return *(Uint16 *)p;

    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
        else
            return p[0] | p[1] << 8 | p[2] << 16;

    case 4:
        return *(Uint32 *)p;

    default:
        return 0;       /* shouldn't happen, but avoids warnings */
    }
}

int main(int argc, char *argv[]){

SDL_Surface* temp;
Uint32 pix;
unsigned int x,y;
unsigned int byte1, byte2, byte3, byte4;

temp = IMG_Load(argv[1]);
  if(temp == NULL){
	printf("Can't load image %s\n",argv[1]);
	return NULL;
  }

  for(x= 0; x < temp->w; x++)
    for(y= 0; y < temp->h; y++){
    	pix= getpixel(temp, x, y);
    	byte1= pix / 16777216;
    	byte2= (pix - byte1*16777216) / 65536;
    	byte3= (pix - byte1*16777216 - byte2*65536) / 256;
    	byte4= pix - byte1*16777216 - byte2*65536 - byte3*256; 
    	
    	printf("%i %i %i %i %i %i \n", x, y, byte4, byte3, byte2, byte1);
    }
}



компилить: gcc -o gluk gluk.c -I/usr/include/SDL -L/usr/lib -lSDL -lSDL_image
юзать: gluk картинка.jpg
       gluk картинка.jpg >> table.txt
выводит таблицу:
       x y R G B A

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

Огромное спасибо!

Попробую, оттестирую, и может даже улчшить удастся (если потребуется). Вообще странно, что в GIMP нету такой фичи в качестве стандартной операции.

garry
() автор топика
Ответ на: комментарий от dimon555

Manы курил, как его для этого использовать -- не нашёл, и очень удивился, так как по определению любая программа, способная читать картинки, уже содержит нужную мне информацию, но вот как её вытащить из памяти?

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

//Упрощённая версия

#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to retrieve */
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

    switch(bpp) {
    case 1:
        return *p;

    case 2:
        return *(Uint16 *)p;

    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
        else
            return p[0] | p[1] << 8 | p[2] << 16;

    case 4:
        return *(Uint32 *)p;

    default:
        return 0;       /* shouldn't happen, but avoids warnings */
    }
}

int main(int argc, char *argv[]){

SDL_Surface* temp;
Uint32 pix;
unsigned int x,y;
unsigned char *byte= &pix;

temp = IMG_Load(argv[1]);
  if(temp == NULL){
	printf("Can't load image %s\n",argv[1]);
	return 0;
  }

  for(x= 0; x < temp->w; x++)
    for(y= 0; y < temp->h; y++){
    	pix= getpixel(temp, x, y);
    	printf("%i %i %i %i %i %i \n", x, y, byte[0], byte[1], byte[2], byte[3]);
    }
 return 1;
}

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

> //Упрощённая версия

Спасибо, cPunk!

Проверил первую версию, работает замечательно, причём на нескольких форматах (я проверил jpg, bmp, tif).

garry
() автор топика
Ответ на: комментарий от cPunk

> >причём на нескольких форматах (я проверил jpg, bmp, tif).

> SDL_image is an image file loading library. It loads images as SDL > surfaces, and supports the following formats: BMP, GIF, JPEG, LBM, PCX, > PNG, PNM, TGA, TIFF, XCF, XPM, XV > > http://www.libsdl.org/projects/SDL_image/ > cPunk (*) (15.07.2008 9:01:56)

Да это я понял из кода, просто хотел подтвердить, что работает и выдаёт примерно одинаковые результаты (кроме BMP -- там идёт сильная пртеря качества (видимо, связанная с трансформацией jpg-> bmp)).

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