我需要使用this page中的以下功能。 SDL_Surface structure定义为

typedef struct SDL_Surface {
    Uint32 flags;                           /* Read-only */
    SDL_PixelFormat *format;                /* Read-only */
    int w, h;                               /* Read-only */
    Uint16 pitch;                           /* Read-only */
    void *pixels;                           /* Read-write */
    SDL_Rect clip_rect;                     /* Read-only */
    int refcount;                           /* Read-mostly */
} SDL_Surface;

该函数是:
void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
      Uint8 *target_pixel = (Uint8 *)surface->pixels + y * surface->pitch + x * 4;
      *(Uint32 *)target_pixel = pixel;
}

在这里我几乎没有疑问,可能是由于缺乏真实的画面。
  • 为什么我们需要将surface->pitchy相乘,而x4相乘?
  • 首先需要将target_pixel声明为8-bit integer pointer,然后再将其转换为32-bit integer pointer的必要性是什么?
  • target_pixel函数返回后,pixel如何保留set_pixel值?
  • 最佳答案

  • 由于每个像素的大小均为4(表面使用的是Uint32值的像素),所以计算是在Uint8中进行的。 4难看,请参阅下文。
  • 使地址计算以字节为单位。
  • 由于要写入的像素实际上是32位,因此指针必须为32位才能进行单次写入。

  • 由于表面的pitch字段以字节为单位,因此计算必须以字节为单位。
    这是一次重写(比我最初的尝试更具侵略性):
    void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
    {
      Uint32 * const target_pixel = (Uint32 *) ((Uint8 *) surface->pixels
                                                 + y * surface->pitch
                                                 + x * surface->format->BytesPerPixel);
      *target_pixel = pixel;
    }
    
    注意我们如何使用surface->format->BytesPerPixel分解出4。魔术常数不是一个好主意。另请注意,以上内容假设表面确实使用了32位像素。

    关于c++ - 如何在SDL_surface中设置像素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20070155/

    10-16 11:28