-1

我正在尝试制作一个简单的图像查看器。我基本上将图像加载到表面中,然后从中创建纹理。

SDL_RenderClear()最后,我按照迁移指南SDL_RenderCopy()进行常规操作。SDL_RenderPresent()

这工作正常,除了如果我SDL_UpdateTexture()在上面的 3 个渲染调用之前调用,我会得到一个混乱的图像:

乱七八糟的图片

我这样调用 SDL_UpdateTexture() :

SDL_UpdateTexture(texture, NULL, image->pixels, image->pitch)

image我为图像加载的表面在哪里,是texture我从中创建的纹理。尝试改变音高会导致不同程度的混乱图像。我也尝试使用矩形作为第二个参数,但如果矩形与图像具有相同的尺寸,结果是相同的。如果尺寸较大(例如与窗口相同),则不会发生更新,但不会出现错误。

完整代码可用。

我想直接通过image->pixels然后调用来操作表面的像素SDL_UpdateTexture(),但是只是调用SDL_UpdateTexture()而不进行任何篡改就足以把事情搞砸了。

4

2 回答 2

2

我认为音高或SDL_Rect参数有问题,但还有另一个 SDL 函数可能会有所帮助:

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                      SDL_Surface*  surface)
于 2015-11-24T16:02:35.313 回答
0

你能不能试试下面的。它应该将任何粉红色 (r=255,g=0,b=255) 像素替换为透明的。您只需更改 pixel32 操作即可满足您的需求。

SDL_Surface* image = IMG_Load(filename);

SDL_Surface* imageFomatted = SDL_ConvertSurfaceFormat(image, 
                                                      SDL_PIXELFORMAT_RGBA8888, 
                                                      NULL);

texture = SDL_CreateTexture(renderer,
                            SDL_PIXELFORMAT_RGBA8888,
                            SDL_TEXTUREACCESS_STREAMING,
                            imageFomatted->w, imageFomatted->h);

void* pixels = NULL;
int pitch = 0;

SDL_LockTexture(texture, &imageFomatted->clip_rect, &pixels, &pitch);

memcpy(pixels, imageFomatted->pixels, (imageFomatted->pitch * imageFomatted->h));

int width   = imageFomatted->w;
int height  = imageFomatted->h;

Uint32* pixels32    = (Uint32*)pixels;
int     pixelCount  = (pitch / 4) * height;

Uint32 colorKey     = SDL_MapRGB(imageFomatted->format, 0xFF, 0x00, 0xFF);
Uint32 transparent  = SDL_MapRGBA(imageFomatted->format, 0xFF, 0x00, 0xFF, 0x00);

for (int i = 0; i < pixelCount; i++) {
  if (pixels32[i] == colorKey) {
    pixels32[i] = transparent;
  }
}

SDL_UnlockTexture(texture);

SDL_FreeSurface(imageFormatted);
SDL_FreeSurface(image);

pixels = NULL;
pitch = 0;
width = 0;
height = 0;
于 2013-09-16T11:50:08.227 回答