开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 849|回复: 18
打印 上一主题 下一主题
收起左侧

[易语言纯源码] [非注册Com组件调用] WIC图像编码组件 - 截图源码

[复制链接]
结帖率:50% (1/2)
跳转到指定楼层
楼主
发表于 2025-1-1 08:43:22 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   广西壮族自治区贵港市
分享源码
界面截图:
是否带模块: -
备注说明: -
本帖最后由 wlp 于 2025-1-1 11:14 编辑



截图.zip (1.51 MB, 下载次数: 24)

什么是非注册com,举个例子:DirectX9, DirectX10, DirectX11,DirectX12那种非注册com只能根据c++接口定义调用,不能用易语言"对象".查看(),cha询到所有方法,只能自己手动实现


这个代码是编码器,还有一个方法是解码器(没实现),两个相互配合就可以做图片格式转换其他格式就不搞了,太麻烦了,默认格式是:bmp(32位RGBA)
这种非注册com组件,用易语言的对象没法调用,只是提供一个方法
这种com接口结构怎么算呢,比如:A继承B
c++里面是
struct B {
   a: int
   b: int
}


struct A: B {
   a: int
   b: int
   c: int
}
易语言里面就这么写  (谁是父类,谁就塞前面,b是a的父类)
{
  b_a
  b_b
  a_a
  a_b
  a_c
}

‘--------------这里可以修改图片格式----------------
  
GUID_ContainerFormatBmp = _UUID (“{0af1d87e-fcfe-4188-bdeb-a7906471cbe3}”)
hr = IWICImagingFactory_CreateEncoder (pFactory, 取变量数据地址 (GUID_ContainerFormatBmp), 0, 取变量数据地址 (pEncoder))


i支持库列表   支持库注释   
spec特殊功能支持库


‘----------------原始的guid--------------------------
DEFINE_GUID(GUID_ContainerFormatBmp,  0x0af1d87e, 0xfcfe, 0x4188, 0xbd, 0xeb, 0xa7, 0x90, 0x64, 0x71, 0xcb, 0xe3);
DEFINE_GUID(GUID_ContainerFormatPng,  0x1b7cfaf4, 0x713f, 0x473c, 0xbb, 0xcd, 0x61, 0x37, 0x42, 0x5f, 0xae, 0xaf);
DEFINE_GUID(GUID_ContainerFormatIco,  0xa3a860c4, 0x338f, 0x4c17, 0x91, 0x9a, 0xfb, 0xa4, 0xb5, 0x62, 0x8f, 0x21);
DEFINE_GUID(GUID_ContainerFormatJpeg, 0x19e4a5aa, 0x5662, 0x4fc5, 0xa0, 0xc0, 0x17, 0x58, 0x02, 0x8e, 0x10, 0x57);
DEFINE_GUID(GUID_ContainerFormatTiff, 0x163bcc30, 0xe2e9, 0x4f0b, 0x96, 0x1d, 0xa3, 0xe9, 0xfd, 0xb7, 0x88, 0xa3);
DEFINE_GUID(GUID_ContainerFormatGif,  0x1f8a5601, 0x7d4d, 0x4cbd, 0x9c, 0x82, 0x1b, 0xc8, 0xd4, 0xee, 0xb9, 0xa5);
DEFINE_GUID(GUID_ContainerFormatWmp,  0x57a37caa, 0x367a, 0x4540, 0x91, 0x6b, 0xf1, 0x83, 0xc5, 0x09, 0x3a, 0x4b);
DEFINE_GUID(GUID_ContainerFormatDds,  0x9967cb95, 0x2e85, 0x4ac8, 0x8c, 0xa2, 0x83, 0xd7, 0xcc, 0xd4, 0x25, 0xc9);
DEFINE_GUID(GUID_ContainerFormatAdng, 0xf3ff6d0d, 0x38c0, 0x41c4, 0xb1, 0xfe, 0x1f, 0x38, 0x24, 0xf1, 0x7b, 0x84);
DEFINE_GUID(GUID_ContainerFormatHeif, 0xe1e62521, 0x6787, 0x405b, 0xa3, 0x39, 0x50, 0x07, 0x15, 0xb5, 0x76, 0x3f);
DEFINE_GUID(GUID_ContainerFormatWebp, 0xe094b0e2, 0x67f2, 0x45b3, 0xb0, 0xea, 0x11, 0x53, 0x37, 0xca, 0x7c, 0xf3);
DEFINE_GUID(GUID_ContainerFormatRaw,  0xfe99ce60, 0xf19c, 0x433c, 0xa3, 0xae, 0x00, 0xac, 0xef, 0xa9, 0xca, 0x21);


’-----------------------下面是chatgpt帮转换的有可能不对----------------------
GUID_ContainerFormatBmp = {0af1d87e-fcfe-4188-bdeb-a7906471cbe3}
GUID_ContainerFormatPng = {1b7cfaf4-713f-473c-bbcd-6137425faeaf}
GUID_ContainerFormatIco = {a3a860c4-338f-4c17-919a-fba4b5628f21}
GUID_ContainerFormatJpeg = {19e4a5aa-5662-4fc5-a0c0-1758028e1057}
GUID_ContainerFormatTiff = {163bcc30-e2e9-4f0b-961d-a3e9fdb788a3}
GUID_ContainerFormatGif = {1f8a5601-7d4d-4cbd-9c82-1bc8d4eeb9a5}
GUID_ContainerFormatWmp = {57a37caa-367a-4540-916b-f183c5093a4b}
GUID_ContainerFormatDds = {9967cb95-2e85-4ac8-8ca2-83d7ccd425c9}
GUID_ContainerFormatAdng = {f3ff6d0d-38c0-41c4-b1fe-1f3824f17b84}
GUID_ContainerFormatHeif = {e1e62521-6787-405b-a339-500715b5763f}
GUID_ContainerFormatWebp = {e094b0e2-67f2-45b3-b0ea-115337ca7cf3}
GUID_ContainerFormatRaw = {fe99ce60-f19c-433c-a3ae-00acefa9ca21}





1.png (179.59 KB, 下载次数: 0)

1.png

评分

参与人数 1好评 +1 精币 +2 收起 理由
qq1056123185 + 1 + 2 易语言也能搞dx截图,等有空再实现..

查看全部评分


结帖率:50% (1/2)

签到天数: 12 天

来自 6楼
 楼主| 发表于 2025-1-1 12:44:40 | 只看该作者   日本
本帖最后由 wlp 于 2025-1-1 12:45 编辑

放一份C++ DXGI截图代码,利用上面的com方法,易语言也能搞dx截图,等有空再实现..

[C++] 纯文本查看 复制代码
#include <windows.h>
#include <dxgi1_2.h>
#include <d3d11.h>
#include <iostream>
#include <vector>

#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3d11.lib")

void SaveScreenPixelsToMemory() {
    // 初始化 D3D11 和 DXGI 设备
    IDXGIFactory1* factory = nullptr;
    HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&factory);
    if (FAILED(hr)) {
        std::cerr << "Failed to create DXGIFactory." << std::endl;
        return;
    }

    IDXGIAdapter1* adapter = nullptr;
    hr = factory->EnumAdapters1(0, &adapter);
    if (FAILED(hr)) {
        std::cerr << "Failed to enumerate adapters." << std::endl;
        return;
    }

    ID3D11Device* device = nullptr;
    ID3D11DeviceContext* context = nullptr;
    D3D_FEATURE_LEVEL featureLevel;
    /*
    hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT,
        nullptr, 0, D3D11_SDK_VERSION, &device, &featureLevel, &context);
    if (FA
    */
    const D3D_FEATURE_LEVEL featureLevels[] = {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
        D3D_FEATURE_LEVEL_9_2,
        D3D_FEATURE_LEVEL_9_1
        };
    hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT,
        featureLevels, 6, D3D11_SDK_VERSION, &device, &featureLevel, &context);
    /*
    hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, 0, 
        nullptr, 0, D3D11_SDK_VERSION, &device, &featureLevel, &context);
        */
    if (FAILED(hr)) {
        std::cerr << "Failed to create D3D11 device." << std::endl;
        return;
    }

    IDXGIOutput* output = nullptr;
    hr = adapter->EnumOutputs(0, &output);
    if (FAILED(hr)) {
        std::cerr << "Failed to enumerate outputs." << std::endl;
        return;
    }

    IDXGIOutput1* output1 = nullptr;
    hr = output->QueryInterface(__uuidof(IDXGIOutput1), (void**)&output1);
    if (FAILED(hr)) {
        std::cerr << "Failed to get IDXGIOutput1." << std::endl;
        return;
    }

    IDXGIOutputDuplication* duplication = nullptr;
    hr = output1->DuplicateOutput(device, &duplication);
    if (FAILED(hr)) {
        std::cerr << "Failed to create output duplication." << std::endl;
        return;
    }

    DXGI_OUTDUPL_DESC duplDesc;
    duplication->GetDesc(&duplDesc);
    int width = duplDesc.ModeDesc.Width;
    int height = duplDesc.ModeDesc.Height;

    // 开始捕获屏幕
    DXGI_OUTDUPL_FRAME_INFO frameInfo = {0};
    IDXGIResource* desktopResource = nullptr;

    while(1) {
        hr = duplication->AcquireNextFrame(500, &frameInfo, &desktopResource);
        if (FAILED(hr)) {
            std::cerr << "Failed to acquire next frame." << std::endl;
            return;
        }
        if (frameInfo.LastPresentTime.QuadPart == 0)
        {
            duplication->ReleaseFrame();
            Sleep(1);
            continue;
        }
        break;
    }

    ID3D11Texture2D* desktopImage = nullptr;
    hr = desktopResource->QueryInterface(__uuidof(ID3D11Texture2D), (void**)&desktopImage);
    if (FAILED(hr)) {
        std::cerr << "Failed to get ID3D11Texture2D from IDXGIResource." << std::endl;
        return;
    }

    // 创建 staging texture 用于 CPU 访问
    D3D11_TEXTURE2D_DESC desc;
    desktopImage->GetDesc(&desc);
    desc.Usage = D3D11_USAGE_STAGING;
    desc.BindFlags = 0;
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    desc.MiscFlags = 0;

    ID3D11Texture2D* stagingTexture = nullptr;
    hr = device->CreateTexture2D(&desc, nullptr, &stagingTexture);
    if (FAILED(hr)) {
        std::cerr << "Failed to create staging texture." << std::endl;
        return;
    }

    context->CopyResource(stagingTexture, desktopImage);

    // 映射纹理到 CPU
    D3D11_MAPPED_SUBRESOURCE mappedResource;
    hr = context->Map(stagingTexture, 0, D3D11_MAP_READ, 0, &mappedResource);
    if (FAILED(hr)) {
        std::cerr << "Failed to map staging texture." << std::endl;
        return;
    }

    // 处理像素数据
    std::vector<unsigned char> pixels;
    pixels.resize(width * height * 4);

    unsigned char* src = (unsigned char*)mappedResource.pData;
    int rowPitch = mappedResource.RowPitch;

    for (int y = 0; y < height; ++y) {
        memcpy(&pixels[y * width * 4], &src[y * rowPitch], width * 4);
    }

    context->Unmap(stagingTexture, 0);

    // 打印一些像素数据
    for (int i = 0; i < 100; ++i) {
        int pixelIndex = i * 4;
        unsigned char b = pixels[pixelIndex + 0];
        unsigned char g = pixels[pixelIndex + 1];
        unsigned char r = pixels[pixelIndex + 2];
        std::cout << "Pixel " << i << ": R=" << (int)r << " G=" << (int)g << " B=" << (int)b << std::endl;
    }

    // 清理资源
    duplication->ReleaseFrame();
    desktopResource->Release();
    stagingTexture->Release();
    desktopImage->Release();
    duplication->Release();
    output1->Release();
    output->Release();
    context->Release();
    device->Release();
    adapter->Release();
    factory->Release();
}

int main() {
    SaveScreenPixelsToMemory();
    return 0;
}

回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 12 天

20
 楼主| 发表于 2025-1-3 13:50:32 | 只看该作者   广西壮族自治区贵港市
uyhj 发表于 2025-1-3 11:47
不知道少了哪,这里不显示了

HEX解码,就是HEX到字节集
回复 支持 反对

使用道具 举报

19
发表于 2025-1-3 11:47:51 | 只看该作者   河南省南阳市

不知道少了哪,这里不显示了
回复 支持 反对

使用道具 举报

结帖率:98% (111/113)

签到天数: 12 天

18
发表于 2025-1-3 07:17:55 | 只看该作者   山东省青岛市
全都是大佬~
回复 支持 反对

使用道具 举报

结帖率:96% (53/55)

签到天数: 12 天

17
发表于 2025-1-3 07:13:30 | 只看该作者   山东省青岛市
感谢发布原创作品,精易因你更精彩!6666666666666
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)

签到天数: 7 天

16
发表于 2025-1-2 12:11:12 | 只看该作者   四川省泸州市
#在这里快速回复#cha询到所有方法
回复 支持 反对

使用道具 举报

签到天数: 9 天

15
发表于 2025-1-2 09:30:12 | 只看该作者   河北省邯郸市
6666666666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 12 天

14
发表于 2025-1-2 07:58:53 | 只看该作者   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 12 天

13
 楼主| 发表于 2025-1-2 07:23:20 | 只看该作者   广西壮族自治区贵港市
美夜赤月 发表于 2025-1-2 00:28
易语言自带的对象确实不好用。
有些东西还得自己造轮子前段时间我用易语言的对象调用“Quartz”死活不行
后 ...

这个还好,有函数信息,不像WIC,只有C的抽象接口
回复 支持 反对

使用道具 举报

结帖率:98% (111/113)

签到天数: 12 天

12
发表于 2025-1-2 07:21:28 | 只看该作者   山东省青岛市
感谢发布原创作品,精易因你更精彩!6666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表