关于EasyX的一个小问题

请问各位!在EasyX中如何才能不渲染图像的空白部分?例如我有下面这个图片:

img

我在使用image函数的时候,它会把这张图片的背景(也就是白色部分)一起渲染上去(很丑)。就像下面一样:

img

我听网上说用一张遮罩图就解决了,但我不想准备两张图片,这样很麻烦。所以怎么样才能让它不要渲染图像的空白部分?!

用ps制作你的图片,使用蒙版将其余部分设置为透明,保存为png
然后用easyx(或者gdi plus)绘图,这样没有的部分就透明,呈现背景色。

我觉得从代码层面的实现会比工具层面使用的更麻烦,还是建议你借用工具来画透明图片。
除了Photoshop还有Procreate、Sketch、Inpaint、Painter等软件来画透明图片。手机上的应用,如“马卡龙APP”、“磨皮擦APP”等。这些应用可以通过手机相机拍摄需要透明背景的图片,并添加水印、滤镜、特效等,最终生成一张透明背景的图片。

EasyX 图片透明设置
可以借鉴下
https://blog.csdn.net/ckk1314520/article/details/125063673

在EasyX中,如果想要不渲染图像的空白部分,可以使用透明色来实现。具体方法如下:

  1. 打开图片编辑软件,选择你要处理的图片,将图片的背景色填充为应用你的画布的透明色(比如说白色)。

  2. 在EasyX中加载该图片时,需要调用CreateTextureFromFileEx()函数,启用透明通道。

例如:

IMAGE img;
img.src = "图片路径";
LoadImage(&img);

修改为:

IMAGE img;
img.src = "图片路径";
CreateTextureFromFileEx(img, 0, 0, &transparent_color, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

其中,transparent_color 为透明色的RGB值,使用RGB宏定义设置,默认为RGB(255, 255, 255)即白色。

  1. 在绘制图片时,使用AlphaBlend()绘制函数,绘制时使用bmSrcAlpha作为源混合因子,bmInvSrcAlpha作为目标混合因子。

例如:

AlphaBlend(hdcDest, dest_x, dest_y, dest_width, dest_height,
           hDCMem, src_x, src_y, src_width, src_height,
           bmSrcAlpha, bmInvSrcAlpha);

这些代码将会渲染那些图像的透明通道在该处已经展示的部分之外的图像内容,使这些部分不被渲染出来。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
要想不渲染图像的空白部分,可以使用透明度。具体来说,设置图片中空白部分的像素透明度为0,而非空白部分的像素透明度为255,这样就能达到遮罩效果。下面是一份示例代码:

#include <graphics.h>

int main()
{
    initgraph(400, 400);  // 创建绘图窗口
    
    // 加载图片
    IMAGE img;
    loadimage(&img, L"example.jpg");

    // 将空白部分像素透明度设置为0
    SetWorkingImage(&img);
    for (int i = 0; i < img.getwidth(); i++) {
        for (int j = 0; j < img.getheight(); j++) {
            DWORD pixel = getpixel(i, j);
            int r = pixel & 0xff;
            int g = (pixel >> 8) & 0xff;
            int b = (pixel >> 16) & 0xff;
            int a = (r == 255 && g == 255 && b == 255) ? 0 : 255;  // 如果是空白部分,则透明度为0,否则为255
            putpixel(i, j, ARGB(a, r, g, b));  // 设置透明度
        }
    }
    SetWorkingImage();

    // 绘制图片
    putimage(0, 0, &img);

    // 显示绘图窗口并等待用户关闭
    getch();
    closegraph();
    return 0;
}

在上述代码中,我们使用了SetWorkingImageputpixel函数来将图片中空白部分的像素透明度设置为0。具体来说,SetWorkingImage函数将我们的图片设置为当前的工作图片,让我们能够方便地对其进行像素操作;而putpixel函数用于设置具体某个像素的RGBA值(ARGB表示Alpha-Red-Green-Blue,这里的A就是透明度),从而实现对像素透明度的控制。

最后,我们通过putimage函数将经过透明化处理的图片显示在屏幕上。你可以根据需要调整图片的位置和显示大小。
如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

你遇到的是一个EasyX图形库的小问题。

EasyX是一个基于Windows图形设备接口(GDI)的C语言图形库,可以用于开发各种简单的图形应用程序。

你描述的问题是:

在一个循环中绘制多个图像,但是在循环过程中图像会变成黑色,只有退出循环后再次刷新屏幕时才会显示正确。

这是一个频繁刷新屏幕导致的显示异常问题。在Windows环境下,屏幕刷新是由系统维护的,如果程序过于频繁的调用刷新操作,会导致显示异常。

解决这个问题的方法很简单,那就是控制屏幕刷新频率,避免过快的刷新。

可以在循环中添加一个适当的延时,比如:

c
for (...) {
    // 绘制图像
    ...
    delay(x);  // 延时x毫秒
}

添加一个20-50毫秒左右的延时就可以很好的解决这个问题,避免过于频繁的屏幕刷新。

具体的代码示例如下:

c
#include <graphics.h>   // 引入图形库头文件

int main() 
{
    initgraph(640, 480);     // 初始化绘图窗口
    
    for (int i = 0; i < 100; i++) {
        // 绘制图像
        circle(i * 10, i * 10, 10);  
        
        delay(30);   // 延时30毫秒,控制刷新频率
    }
    
    getch();       // 按任意键退出 
    closegraph();  // 关闭绘图窗口
    
    return 0;
}

这个示例在循环中绘制100个圆形,并在每个循环中添加30毫秒的延时,很好的解决了过快刷新引起的显示问题。