winform gif图片静态显示问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform gif图片静态显示问题相关的知识,希望对你有一定的参考价值。

用winform完成图片浏览功能,图片来自网上,根据地址获取,不确定静态还是动态,都要实现浏览该如何解决?(用panel背景图存图,还有其他功能)
string imgLocation = "";//网络地址
Image img = Image.FromStream(WebRequest.Create(imgLocation).GetResponse().GetResponseStream());
panel1.BackgroundImage = img;
除了gif读取动态显示,必须要考虑屏幕闪烁的问题,只用picturebox闪的太厉害了,没其他方法吗?

参考技术A 建议你用pictureBox控件。只要把你获取到的图片给pictureBox1控件的Image就可以了,如果是动态的GIF就能显示为动画。
你的说法我不这里都没出现过。也不会闪。是不是图片过大了。机子如果运行太多东东慢了之后都会这样的。如果要自己画的话也是可以的。首先将要显示的图片下载完全之后对图片帧进行读取分析如果有多个帧就把它存到List<image>数组中然后按照图片动画的速度用TIMER进行按序更换。
参考技术B 嵌入一个webbrowser,然后将图像设置为浏览器内容就好了。这应当是最快的办法了。

不然就是使用第3方控件,搜索一下“c# GifBox”

还有一个办法就是使用Image 读出Gif的帧信息,然后设置定时器,一帧一帧的读出图像并进行显示。每帧显示的时候注意时间间隔 。不过第一帧都有自己的控制信息,比较间隔时间,显示位置,所以自己写要做的好还是相当麻烦的。本回答被提问者和网友采纳
参考技术C 只要把你的panel1改成picturebox 就可以了。。追问

用panel背景图存图是为了仿屏幕闪烁,双内存不理想,picturebox闪的厉害,其他办法有吗?

追答

如果闪烁,就比较麻烦了

如何在使用线程的c ++ winform中同时显示网络摄像头

【中文标题】如何在使用线程的c ++ winform中同时显示网络摄像头【英文标题】:how to show webcams at a same time using in c++ winform using threads 【发布时间】:2021-08-13 09:41:38 【问题描述】:

我想使用线程在两个不同的图片框上显示我的网络摄像头。 但问题在于图片框显示网络摄像头,而另一个仅显示网络摄像头的静态图片。 我希望两个图片框同时显示网络摄像头,但我希望使用线程来提高性能。 任何想法如何解决它? 将不胜感激;

这是代码

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>

Mat _frame1;

Mat _frame2;

bool s1 = false;
bool s2 = false;

void start_picture_Box1()

    s1 = true;
    VideoCapture cap(0);
    while (s1) 
        cap >> _frame1;

        mat2picture bimapconvert;
        this->pictureBox1->Image = bimapconvert.Mat2Bimap(_frame1);

        pictureBox1->Refresh();
        if (waitKey(1) == 27) 
            break;
        
    


void start_picture_Box2()

    s2 = true;
    VideoCapture cap1(0);
    while (s2) 
        cap1 >> _frame2;

        mat2picture bimapconvert;
        this->pictureBox2->Image = bimapconvert.Mat2Bimap(_frame2);

        pictureBox2->Refresh();
        if (waitKey(1) == 27) 
            break;
        
    


public: void picture_Box1()


    Invoke(gcnew System::Action(this, &MyForm::start_picture_Box1));


 public: void picture_Box2()
 
     Invoke(gcnew System::Action(this, &MyForm::start_picture_Box2));
 


private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)

ThreadStart^ ThreadMethod1 = gcnew ThreadStart(this, &MyForm::picture_Box1);
ThreadStart^ ThreadMethod2 = gcnew ThreadStart(this, &MyForm::picture_Box2);
Thread^ MyThread1 = gcnew Thread(ThreadMethod1);
Thread^ MyThread2 = gcnew Thread(ThreadMethod2);
MyThread1->Start();
MyThread2->Start();


private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) 
s1 = false;
s2 = false;

【问题讨论】:

【参考方案1】:

首先,您在从不同来源获取输入的两个图像中进行 VideoCapture。

如果您在主线程上进行视频捕获并将来自网络摄像头的图像存储在一个框架中并将其发送到您想要的不同线程会更好。

【讨论】:

你能给我看一个示例代码吗?我被这个程序卡住了

以上是关于winform gif图片静态显示问题的主要内容,如果未能解决你的问题,请参考以下文章

动态图片显示控件----------WinForm控件开发系列

html网页中的gif动画不正常显示,谁知道原因

C#,winform,怎样在一个页面显示前,首先先显示个等待提示?

如何在使用线程的c ++ winform中同时显示网络摄像头

如何在vb窗体中显示gif动画

imageview 动画 gif 仅显示静态