Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: kuvan lukeminen/muokkaaminen

Touho [25.03.2005 13:35:30]

#

Piirsin kuvan, jossa on vain värejä 255,0,255 ja 0,0,0.
Ohjelman tulisi lukea mustat kohdat ja piirtää näihin paikkoihin jatkuvasti vahtuvia värejä. Ongelmia synty. Ohjelma toimii tavallaan, mutta tulos ei ole odotettua.

Ongelman näkee parhaiten testaamalla sitä: zux.sjr.fi/touho/pic.zip

koodi:

#include <SDL/SDL.h>
#include <stdlib.h>
#include <time.h>

#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL.lib")

SDL_Surface *screen;

Uint32 *bufp;
Uint8 *keys;
SDL_Event event;

void DrawIMG(SDL_Surface *img, int x, int y)  //kuvaan tarvittavat funktiot
{
	SDL_Rect dest;
	dest.x = x;
	dest.y = y;
	SDL_BlitSurface(img, NULL, screen, &dest);
}
void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2)
{
	SDL_Rect dest;
	dest.x = x;
	dest.y = y;
	SDL_Rect dest2;
	dest2.x = x2;
	dest2.y = y2;
	dest2.w = w;
	dest2.h = h;
	SDL_BlitSurface(img, &dest2, screen, &dest);
}
int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect,
					SDL_Surface *dst, SDL_Rect *dstrect);

int main(int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)  // SDL
    {
        printf("Error to Init yms.. %s\n", SDL_GetError());
        exit(1);
    }

    atexit(SDL_Quit);

	SDL_Surface *pic = SDL_LoadBMP("pic.bmp");

	screen = SDL_SetVideoMode(pic->w, pic->h, 32, SDL_SWSURFACE);

    if (screen == NULL) {
        printf("Unable to set video mode.. sry .. &s\n", SDL_GetError());
        exit(1);
    }
	bool onko[800][800];
	int x, y;
	int a=10, vari=50;

	for(x=0;x<pic->w;x++)
	for(y=0;y<pic->h;y++)
	{
		bufp=(Uint32 *)pic->pixels + y*pic->pitch/4 + x;
		if(*bufp==SDL_MapRGB(pic->format, 0, 0, 0))
			onko[x][y]=true;
		else onko[x][y]=false;
	}

	SDL_SetColorKey(pic, SDL_SRCCOLORKEY,SDL_MapRGB(pic->format,255,0,255));

	while(1)
	{
		vari+=a;
		if(vari>255)a=-10;
		if(vari<50)a=10;

		for(x=0;x<pic->w;x++)
		for(y=0;y<pic->h;y++)
		{
			if(onko[x][y])
			{
				bufp = (Uint32 *)pic->pixels + y*pic->pitch/4 + x;
				*bufp = SDL_MapRGB(pic->format, 255, vari, vari);
			}
		}

		DrawIMG(pic, 0, 0);

		SDL_PollEvent(&event);
		if ( event.type == SDL_QUIT ) return 0;
		keys = SDL_GetKeyState(NULL);
		if ( keys[SDLK_ESCAPE]) break;

		SDL_Flip(screen);
	}
	return 0;
}

Ilmuri [26.03.2005 01:43:09]

#

Käytät jotain oikeata sattumanvaraisuusfunktiota tyyliin Rand(), Random() tjsp, googlella tai ihan vaan kääntäjän include-kansiosta voi löytyä lisää apua. Ja kannattaisi varmaan muuten pistää joka pikselille oma arvo, c++:ssa pitäisi olla ihan tarpeeksi vääntöä moiseen.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta