#include <libsdl/SDL.h>
//#include "SDL.h"

#ifdef TEST_VGA16 /* Define this if you want to test VGA 16-color video modes */
#define NUM_COLORS 16
#else
#define NUM_COLORS 256
#endif
SDL_Surface *screen;

void display_bmp()
{
    SDL_Surface *image;
    char *file_name = "d:\\temp\\bao.bmp";
    /* Load the BMP file into a surface */
    image = SDL_LoadBMP(file_name);
    if (image == NULL) {
       // fprintf(stderr, "Couldn't load %s: %s\n", file_name, SDL_GetError());
        return;
    }

    /*
     * Palettized screen modes will have a default palette (a standard
     * 8*8*4 colour cube), but if the image is palettized as well we can
     * use that palette for a nicer colour matching
     */
    if (image->format->palette && screen->format->palette) 
{
    SDL_SetColors(screen, image->format->palette->colors, 0,
                  image->format->palette->ncolors);
    }

    /* Blit onto the screen surface */
    if(SDL_BlitSurface(image, NULL, screen, NULL) < 0)
        fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());

    SDL_UpdateRect(screen, 0, 0, image->w, image->h);

    /* Free the allocated BMP surface */
    SDL_FreeSurface(image);
}
CString str;
void CSdl_testDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
m_list.ResetContent();

SDL_Event event;
    if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { 
        str.Format("Could not initialize SDL: %s.\n", SDL_GetError());
        m_list.AddString(str);
    }

    m_list.AddString("SDL initialized.");

/* Have a preference for 8-bit, but accept any depth */
    screen = SDL_SetVideoMode(720, 576, 16, SDL_SWSURFACE|SDL_ANYFORMAT);
    if ( screen == NULL ) {
        str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
        m_list.AddString(str);
    }
    str.Format("Set 720*576 at %d bits-per-pixel mode",
screen->format->BitsPerPixel);
m_list.AddString(str);

    display_bmp();
    
    /* Shutdown all subsystems */
//  
    
    m_list.AddString("Quiting.... press image!");

while (SDL_WaitEvent(&event) ) 
{
switch (event.type)
{
case SDL_MOUSEBUTTONDOWN:
SDL_Quit();
return ;
break;
case SDL_KEYDOWN:
if ( event.key.keysym.sym == SDLK_SPACE ) 
{
SDL_Quit();
return ;
break;
}
}
}
}

void CSdl_testDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
int i = 1;
    int x, y;
    int w = 720;
    int h = 576;
    char c = 'n';

    FILE* fp;
    char filename[64];
    unsigned char* pY;
    unsigned char* pU;
    unsigned char* pV;
    SDL_Rect rect;
m_list.ResetContent();
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        fprintf(stderr, "can not initialize SDL:%s\n", SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit);

    screen = SDL_SetVideoMode(720, 576, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
    if ( screen == NULL ) {
        str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
        m_list.AddString(str);
    }

    SDL_Overlay* overlay = SDL_CreateYUVOverlay(w, h, SDL_YV12_OVERLAY, screen);
    if (overlay == NULL)
    {
        fprintf(stderr, "create overlay error!\n");
        exit(1);
    }

    printf("w:%d, h:%d, planes:%d\n", overlay->w, overlay->h, overlay->planes);
    printf("pitches:%d, %d, %d\n", overlay->pitches[0], overlay->pitches[1], overlay->pitches[2]);

    pY = (unsigned char*)malloc(w*h);
    pU = (unsigned char*)malloc(w*h/4);
    pV = (unsigned char*)malloc(w*h/4);

   
        SDL_LockSurface(screen);
        SDL_LockYUVOverlay(overlay);

 
        fp = fopen("d:\\temp\\1.yuv", "rb");
        if (fp == NULL)
        {
            fprintf(stderr, "open file error!\n");
            exit(1);
        }
while (!feof(fp))
{
        fread(pY, 1, w*h, fp);
        fread(pU, 1, w*h/4, fp);
        fread(pV, 1, w*h/4, fp);

        memcpy(overlay->pixels[0], pY, w*h);
        memcpy(overlay->pixels[1], pV, w*h/4);
        memcpy(overlay->pixels[2], pU, w*h/4);

       

        SDL_UnlockYUVOverlay(overlay);
        SDL_UnlockSurface(screen);

        rect.w = w;
        rect.h = h;
        rect.x = rect.y = 0;
        SDL_DisplayYUVOverlay(overlay, &rect);

        SDL_Delay(40);

        i += 1;
str.Format("current frmcnt:%d",i);
m_list.AddString(str);
    }
fclose(fp);
    free(pY);
    free(pU);
    free(pV);


    SDL_FreeYUVOverlay(overlay);
    SDL_FreeSurface(screen);

    
}
//unsigned char buff[720*576*3];
unsigned int rgb[720*576];
void CSdl_testDlg::OnButton3() 
{
// TODO: Add your control notification handler code here
m_list.ResetContent();

// SDL_Event event;
if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        fprintf(stderr, "can not initialize SDL:%s\n", SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit);

    screen = SDL_SetVideoMode(720, 576, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
    if ( screen == NULL ) {
        str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
        m_list.AddString(str);
    }

SDL_Surface *image;

    Uint32 rmask, gmask, bmask, amask;

    /* SDL interprets each pixel as a 32-bit number, so our masks must depend
       on the endianness (byte order) of the machine */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
    rmask = 0xff000000;
    gmask = 0x00ff0000;
    bmask = 0x0000ff00;
    amask = 0x000000ff;
#else
    rmask = 0x000000ff;
    gmask = 0x0000ff00;
    bmask = 0x00ff0000;
    amask = 0xff000000;
#endif

    image = SDL_CreateRGBSurface(SDL_SWSURFACE, 720, 576, 0,
                                   rmask, gmask, bmask, amask);
    if(image == NULL) {
        fprintf(stderr, "CreateRGBSurface failed: %s\n", SDL_GetError());
        exit(1);
    }

// SDL_LockSurface(screen);
  //  SDL_LockSurface(image);
    CBitmap m_bitmap; 
    HBITMAP m_hBitmap;
BITMAP bm;//存放位图信息的结构

m_hBitmap = (HBITMAP)::LoadImage(NULL,"d:\\temp\\bao.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);   //装载位图
if(m_bitmap.m_hObject)
m_bitmap.DeleteObject();
m_bitmap.Attach(m_hBitmap);//将句柄与CBitmap关联起来
m_bitmap.GetBitmap(&bm);
m_bitmap.GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,rgb);
//

    memcpy(screen->pixels,rgb,720*576*4);
  //  SDL_UnlockSurface(image);
// SDL_UnlockSurface(screen);

    SDL_UpdateRect(screen, 0, 0, image->w, image->h);
    
    /* Free the allocated BMP surface */
    SDL_FreeSurface(image);
}

void CSdl_testDlg::OnButton4() 
{
// TODO: Add your control notification handler code here
int i = 1;
    int x, y;
    int w = 720;
    int h = 576;
    char c = 'n';

    FILE* fp;
    char filename[64];
    unsigned char* pY;
 //   unsigned char* pU;
 //   unsigned char* pV;
    SDL_Rect rect;
m_list.ResetContent();
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        fprintf(stderr, "can not initialize SDL:%s\n", SDL_GetError());
        exit(1);
    }
    atexit(SDL_Quit);

    screen = SDL_SetVideoMode(720, 576, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
    if ( screen == NULL ) {
        str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
        m_list.AddString(str);
    }

    SDL_Overlay* overlay = SDL_CreateYUVOverlay(w, h, SDL_YUY2_OVERLAY, screen);
    if (overlay == NULL)
    {
        fprintf(stderr, "create overlay error!\n");
        exit(1);
    }

    printf("w:%d, h:%d, planes:%d\n", overlay->w, overlay->h, overlay->planes);
    printf("pitches:%d, %d, %d\n", overlay->pitches[0], overlay->pitches[1], overlay->pitches[2]);

    pY = (unsigned char*)malloc(w*h*2);
//    pU = (unsigned char*)malloc(w*h/4);
//    pV = (unsigned char*)malloc(w*h/4);

   
        SDL_LockSurface(screen);
        SDL_LockYUVOverlay(overlay);

 
        fp = fopen("d:\\TEMP\\6082.dat", "rb");
        if (fp == NULL)
        {
            fprintf(stderr, "open file error!\n");
            exit(1);
        }
while (!feof(fp))
{
        fread(pY, 1, w*h*2, fp);


        memcpy(overlay->pixels[0], pY, w*h*2);


       

        SDL_UnlockYUVOverlay(overlay);
        SDL_UnlockSurface(screen);

        rect.w = w;
        rect.h = h;
        rect.x = rect.y = 0;
        SDL_DisplayYUVOverlay(overlay, &rect);

        SDL_Delay(40);

        i += 1;
str.Format("current frmcnt:%d",i);
m_list.AddString(str);
    }
fclose(fp);
    free(pY);
//    free(pU);
  //  free(pV);


    SDL_FreeYUVOverlay(overlay);
    SDL_FreeSurface(screen);
}

http://download.csdn.net/detail/mao0514/8202701

MFC下用sdl 显示bmp、rgb、yuv的更多相关文章

  1. 在c++MFC下用PCL显示操作点云文件 MFC对话框显示操作PCL点云

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/13115873.html 第一步 下载PCL库  我的版本是1.8.1的 你都要MFC下跑PCL ...

  2. 嵌入式linux------SDL移植(am335x下显示bmp图片)

    #include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...

  3. 【秒懂音视频开发】21_显示BMP图片

    文本的主要内容是:使用SDL显示一张BMP图片,算是为后面的<播放YUV>做准备. 为什么是显示BMP图片?而不是显示JPG或PNG图片? 因为SDL内置了加载BMP的API,使用起来会更 ...

  4. MFC对话框显示BMP图片

    1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...

  5. MFC对话框中显示BMP,JPG图片

    //************************************ // 方法说明:    显示JPG和GIF.BMP图片 // 参数说明:    CDC * pDC           设 ...

  6. 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像

    远程控制编写之屏幕传输  MFC实现  屏幕截图 发送bmp数据 显示bmp图像: 一 : 首先要了解bmp图像的结构 详情请看我转载的一篇文章http://blog.csdn.net/hnust_x ...

  7. MFC中显示 .bmp格式的位图

    最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进 ...

  8. Android下基于SDL的YUV渲染

    实战篇 本文主要参考我之前整理的文章windows下使用SDL进行YUV渲染. 相对于之前写的位图渲染部分(http://www.cnblogs.com/tocy/p/android-sdl-bitm ...

  9. MFC显示bmp图像

    有了bmp文件读写的基础,我们就能够開始用MFC显示BMP图片了. 在这里,事实上微软为我们提供了一个实现bmp文件显示的框架,名叫diblook,我们能够先下载下来看看. 以下上链接:DIBLOOK ...

随机推荐

  1. 【Thinkphp 5】auth权限设置以及实现

    1.将auth类下载好 放置目录: extend\auth\auth.php 2.将类中的SQL语句执行,可以在数据库中创建3张表 auth_group(用户组表)           auth_ru ...

  2. img的属性alt 与 title的区别

    当我们给图片加属性的时候,初学时,可能会弄混淆alt与title的区别,那么这两个的区别,我们可以从本意来看—— alt原词是“Alternate”,切换,替换的意思.常用的输入法切换会用到alt键进 ...

  3. 分布式唯一id:snowflake算法思考

    匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...

  4. 梅安森元图地图开放平台、专业GIS地图平台

    元图地图开放平台:http://map.cmetamap.com/?from=groupmessage 梅安森元图地图开放平台: 自主知识产权,专业GIS地图平台,用简单语言即可轻松操作复杂的互联网地 ...

  5. FTP工具

    上传本地资源到FTP服务器,可以使用LeapFTP软件.左侧为本地资源,右侧为FTP资源.输入用户名,密码,连接后直接拖动即可. 为本地资源建立FTP,可以方便进行设备升级.文件传输等.

  6. Spring整合JMS(四)——事务管理

    原文链接:http://haohaoxuexi.iteye.com/blog/1983532 Spring提供了一个JmsTransactionManager用于对JMS ConnectionFact ...

  7. 洛谷 [P3110] 驮运

    题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值. #include <iostream> #include ...

  8. spring security 4 filter 顺序及作用

    Spring Security 有两个作用:认证和授权 一.Srping security 4 filter 别名及顺序 spring security 4 标准filter别名和顺序,因为经常要用就 ...

  9. Windows Azure Storage (25) Azure Append Blob

    <Windows Azure Platform 系列文章目录> 在笔者之前的文章中,我们介绍了Azure Blob 有两种:Block Blob和Page Blob. 在这里笔者介绍Blo ...

  10. 2018/2/14 设计模式学习笔记(一) 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟

    因为本人目前为止学习编程不过七个月,所以后面的感悟对于一些大神来说可能嗤之以鼻,但对于一些刚刚入门的萌新来说在理解面向对象的思想上,以及抽象类和接口应该怎么设计等方面应该还是会有所帮助的 首先我们定义 ...