如何在SDL 2.0中绘制像素?

30
如何在SDL2.0中使用像素绘图?
我正在尝试熟悉C++,但是没有漂亮的图片很难做到这一点,因此我正在尝试运行一个非常基本的图形显示程序。我真正想要它做的就是给我一个窗口,让我在上面绘制rgbα像素,并访问有关这些像素的信息。也许还有其他我不知道的东西,但那就是我目前列表上的全部内容。我的研究指导我尝试使用SDL,当前版本为2.0。
我的大部分图形经验都来自于在上使用JavaScript。其他大部分经验来自于我的计算器,它有这个非常棒的Pxl-On()命令,非常容易使用。
我正在使用MinGW进行C++开发,如果有影响的话。此外,如果有比我所需功能更好的解决方案,欢迎提供建议。
"更好"意味着 "包含我需要的功能,但总体功能少于SDL2.0和/或具有更直观/不太复杂的API比SDL2.0更好"。
"不太复杂"意味着完成相同任务的代码行数较少。
3个回答

32

可运行的示例

使用SDL_RenderDrawPoint在屏幕上逐像素绘制一条红色对角线。

enter image description here

main.c

#include <stdlib.h>

#include <SDL2/SDL.h>

#define WINDOW_WIDTH 600

int main(void) {
    SDL_Event event;
    SDL_Renderer *renderer;
    SDL_Window *window;
    int i;

    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_WIDTH, 0, &window, &renderer);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
    SDL_RenderClear(renderer);
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    for (i = 0; i < WINDOW_WIDTH; ++i)
        SDL_RenderDrawPoint(renderer, i, i);
    SDL_RenderPresent(renderer);
    while (1) {
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}

GitHub上游

编译并运行:

gcc -std=c89 -Wextra -pedantic-errors -o main.out main.c -lSDL2
./main.out
如果您想一次性设置大量像素,例如整个屏幕或精灵,请使用SDL_Texture+ SDL_RenderCopy 和可能的SDL_TEXTUREACCESS_STREAMING,因为这样会更快。 示例在以下网址: 在libsdl 2.0.2,Ubuntu 15.10上测试过。

@iFurane 我在 Ubuntu 22.10 上没有复现,你能提供更多详细的复现信息吗?使用的是哪个操作系统?使用给出答案中完全相同的 CLI 吗? inv main(void) 是有效的 main 签名:https://dev59.com/7HVC5IYBdhLWcg3wtzkQ - Ciro Santilli OurBigBook.com

28

我不知道你的代码结构是怎样的。假设你有一个SDL_Window和一个SDL_Renderer,你只需要调用SDL_RenderDrawPoint(renderer, x, y)

如果你没有渲染器和窗口,你可以使用SDL_CreateWindowAndRenderer()创建两者。例如:

SDL_Window *window;
SDL_Renderer *renderer;
SDL_CreateWindowAndRenderer(800, 600, 0, &window, &renderer);

//Probably on a loop
  SDL_RenderDrawPoint(renderer, 400, 300); //Renders on middle of screen.
  SDL_RenderPresent(renderer);

这应该在屏幕中央绘制一个像素。要读取像素有点复杂。您可以使用SDL_RenderReadPixels(),它用于读取区域,但始终可以指定1x1的区域。如果您确实需要,请阅读维基页面

如果您在使用SDL2时遇到了很多麻烦,我建议您阅读Lazy Foo教程。SDL2部分仍在进行中,但已经有足够的材料开始学习了。


3

我发现使用Python + PySDL2 更容易进行原型设计。调试也很有趣,因为像素图形的速度非常慢。=)这是完整的代码:

"""
The code is placed into public domain
by anatoly techtonik <techtonik@gmail.com>
"""

import sdl2
import sdl2.ext

sdl2.ext.init()

window = sdl2.ext.Window('', size=(300, 100))
window.show()

renderer = sdl2.ext.Renderer(window)
renderer.draw_point([10,10], sdl2.ext.Color(255,255,255))
renderer.present()

running = True
while running:
  for e in sdl2.ext.get_events():
    if e.type == sdl2.SDL_QUIT:
      running = False
      break
    if e.type == sdl2.SDL_KEYDOWN:
      if e.key.keysym.sym == sdl2.SDLK_ESCAPE:
        running = False
        break

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接