用 electron 实现类似 QQ 的长截图(滚动截图)有办法吗?

027西瓜皮  (UID: 4279) [复制链接]
帖子链接已复制到剪贴板
帖子已经有人评论啦,不支持删除!

1762 3

本人现在在做 pear-rec ( https://github.com/027xiguapi/pear-rec ),一个用 electron 可以截图和图片编辑查看的跨平台软件,现在想实现实现类似 QQ 的长截图(滚动截图),一直没有思路,大佬们,有知道怎么实现的吗?用 electron 实现类似 QQ 的长截图(滚动截图)有办法吗?

这家伙太懒了,什么也没留下。
已有评论 ( 3 )
  • 头像
    V 橙梓 (UID: 553)
    1楼

    试试跟随用户鼠标事件连续截图+拼接呢?不确定QQ怎么实现的但是调用Windows  API很显然不能做到跨端,不过这样不确定Electron的Transparent  Window能不能做到

  • 头像
    V 胖虎_ (UID: 2112)
    2楼

    下面是ai生成的,可以参考,你也可以自己问问ai思路

    在Electron中实现长截图的方法与使用其他编程语言和框架时类似。下面是一种基本的思路:

     

    获取需要截图的内容,可以是整个窗口或某个特定区域。

     

    将截图内容保存到临时文件中。Electron提供了屏幕捕获API  desktopCapturer  来截取指定区域的屏幕内容。

     

    使用一个第三方库来将多个截图合并为长图。比如使用Node.js的图像处理库  sharp  或者  canvas。

     

    以下是一个简单的示例代码,展示了如何在Electron中实现长截图:

     

    javascript

    const  {  app,  BrowserWindow,  ipcMain,  desktopCapturer  }  =  require('electron');

    const  sharp  =  require('sharp');

     

    let  mainWindow;

     

    function  createWindow()  {

        mainWindow  =  new  BrowserWindow({

            width:  800,

            height:  600,

        });

     

        mainWindow.loadURL('http://example.com');  //  加载需要截图的页面

     

        mainWindow.webContents.on('did-finish-load',  ()  =>  {

            //  当页面加载完成后进行截图操作

            captureScreen();

        });

    }

     

    async  function  captureScreen()  {

        const  sources  =  await  desktopCapturer.getSources({  types:  ['window',  'screen']  });

     

        //  选择需要截图的源,这里假设选择第一个窗口

        const  source  =  sources[0];

     

        const  stream  =  await  navigator.mediaDevices.getUserMedia({

            audio:  false,

            video:  {

                mandatory:  {

                    chromeMediaSource:  'desktop',

                    chromeMediaSourceId:  source.id,

                    minWidth:  800,

                    minHeight:  600,

                    maxWidth:  800,

                    maxHeight:  600,

                },

            },

        });

     

        const  videoTrack  =  stream.getVideoTracks()[0];

        const  imageCapture  =  new  ImageCapture(videoTrack);

     

        const  chunks  =  [];

     

        //  监听视频数据

        videoTrack.onended  =  ()  =>  {

            const  completeBuffer  =  new  Uint8Array(chunks.reduce((acc,  chunk)  =>  acc  +  chunk.byteLength,  0));

            let  offset  =  0;

            for  (const  chunk  of  chunks)  {

                completeBuffer.set(new  Uint8Array(chunk),  offset);

                offset  +=  chunk.byteLength;

            }

     

            //  将截取的视频数据转为图片

            sharp(Buffer.from(completeBuffer))

                .toFile('long_screenshot.png',  (err,  info)  =>  {

                    if  (err)  {

                        console.error(err);

                        return;

                    }

                    console.log(info);

                });

        };

     

        const  reader  =  videoTrack.readable.getReader();

     

        //  监听可读流数据

        reader.read().then(function  process({  done,  value  })  {

            if  (done)  return;

     

            chunks.push(value.buffer);

            return  reader.read().then(process);

        });

    }

     

    app.whenReady().then(createWindow);

     

    app.on('window-all-closed',  ()  =>  {

        if  (process.platform  !==  'darwin')  {

            app.quit();

        }

    });

    在上述代码中,我们使用desktopCapturer  API选择了需要截图的源(这里假设为第一个窗口),然后使用getUserMedia  API从源中获取视频流。将视频流的数据收集到数组中,并使用sharp库将数据转换为图片,并保存为long_screenshot.png。通过这种方式,我们最终得到了一张长截图。

     

    请注意,上述代码只是一个简单的示例供参考。实际开发中,您可能需要根据具体需求进行定制和优化。

  • 头像
    027西瓜皮 (UID: 4279)
    3楼
    胖虎_ 下面是ai生成的,可以参考,你也可以自己问问ai思路 在Electron中实现长截图的方法与使用其他编程语言和框架时类似。下面是一种基本的思路: 获取需要截图的内容,可以是整个窗口或某个特定区 ...

    谢谢

域名市场
   域名载入中...
创建新帖
自助推广购买广告位
确认删除
确定要删除这篇帖子吗?删除后将无法恢复。
删除成功
帖子已成功删除,页面将自动刷新。
删除失败
删除帖子时发生错误,请稍后再试。