qnx窗口上的JPEG图像

沙爹

Helo All,我正在一个项目中,我有jpg文件,我必须在QNX屏幕上显示它。我想使用libjpeg读取JPEG文件并对其进行解码,并使用窗口像素图在qnx窗口上显示它。我尝试按以下方式编写代码,但没有响应,屏幕保持黑色。

我想弄清楚我的JPEG文件在ycbcr中(4.2.0子采样),但这并不重要。sRGB格式的JPEG文件也可以。如果您可以提供帮助,请告诉我。提前致谢

这是我的代码看起来像

        #include <stdio.h>
        #include <stdlib.h>
        #include <jpeglib.h>
        #include <jpegint.h>

        #ifdef __QNX__
        #include <time.h>
        #include <screen/screen.h>
        #include <png.h>
        #include <sys/netmgr.h>
        #include <sys/neutrino.h>
        #include <dirent.h>
        #include <img/img.h>
        #endif

       screen_context_t screen_ctx;
        screen_window_t screen_win;
        screen_buffer_t screen_pbuf = 0;
        screen_pixmap_t screen_pix;

        int rect[4] = { 0, 0 };
        int usage = 0;
        screen_buffer_t screen_buf[2];



        FILE *JPEG_open(char *filename)
        {
           unsigned char c1, c2;
           FILE *fd = fopen(filename, "rb");
           if (fd != NULL)
           {
              c1 = fgetc(fd);
              c2 = fgetc(fd);
              if (c1 == 0xff && c2 == 0xd8)
                 rewind(fd);
              else
              {
                 fclose(fd);
                 fd = NULL;
              }
           }
           return fd;
        }


        void JPEG_read_header(FILE *fd, int *pixtype, int *xdim, int *ydim)
        {
           // JPEG declarations
           struct jpeg_decompress_struct dinfo;
           struct jpeg_error_mgr jerr;

           // Initialize the JPEG decompression object with default error handling
           dinfo.err = jpeg_std_error(&jerr);
           jpeg_create_decompress(&dinfo);
           jpeg_stdio_src(&dinfo, fd);

           // Read file header, set default decompression parameters
           jpeg_read_header(&dinfo, TRUE);
           jpeg_calc_output_dimensions(&dinfo);
           *xdim = dinfo.output_width;
           *ydim = dinfo.output_height;

           // Determine pixel type
           if (dinfo.out_color_space == JCS_GRAYSCALE){
              *pixtype = JPEG_GRAY;
              printf("Image format is - JPEG_GRAY");
           }
           else if(dinfo.out_color_space == JCS_YCbCr){
              printf("Image format is - JCS_YCbCr");
           }
           else{
              *pixtype = JPEG_RGB;
              printf("Image format is - JPEG_RGB");
           }

           // Close JPEG decompressor and input file
           jpeg_destroy_decompress(&dinfo);
           rewind(fd);
        }

        /*---------------------------------------------------------------------------*/
        /* Purpose:  This reads JPEG data.                                           */
        /*---------------------------------------------------------------------------*/
        void JPEG_read_data(FILE *fd, char *data)
        {
           // JPEG declarations
           struct jpeg_decompress_struct dinfo;
           struct jpeg_error_mgr jerr;
           JSAMPARRAY buffer;
           JSAMPROW ptr;
           int stride, row, value, index = 0;

           // Initialize the JPEG decompression object with default error handling
           dinfo.err = jpeg_std_error(&jerr);
           jpeg_create_decompress(&dinfo);
           jpeg_stdio_src(&dinfo, fd);

           // Read file header, set default decompression parameters
           jpeg_read_header(&dinfo, TRUE);
           printf("safjlasdfj");
           jpeg_calc_output_dimensions(&dinfo);
           jpeg_start_decompress(&dinfo);

           // Calculate number of samples per row in output buffer
           stride = dinfo.output_width * dinfo.output_components;
           buffer = (*dinfo.mem->alloc_sarray) ((j_common_ptr) & dinfo, JPOOL_IMAGE,(JDIMENSION) stride, (JDIMENSION) 1);

           // Process JPEG scanlines
           while (dinfo.output_scanline < dinfo.output_height)
           {
              jpeg_read_scanlines(&dinfo, buffer, 1);
              ptr = buffer[0];
              for (row = 0; row < stride; row++)
              {
                 value = GETJSAMPLE(*ptr++);
                 data[index++] = (unsigned char) value;
              }
           }

           // Finish decompression and release memory
           jpeg_finish_decompress(&dinfo);
           jpeg_destroy_decompress(&dinfo);
        }





        int main (int argc, char *argv[])
        {

           printf("JPEG_read_data");

           screen_create_context(&screen_ctx, SCREEN_APPLICATION_CONTEXT);
           screen_create_window(&screen_win, screen_ctx);
           usage = SCREEN_USAGE_NATIVE;
           screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_USAGE, &usage);

           screen_create_window_buffers(screen_win, 2);
           screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, rect+2);
           screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)screen_buf);

           int bg[] = { SCREEN_BLIT_COLOR, 0x00000000, SCREEN_BLIT_END };
           screen_fill(screen_ctx, screen_buf[0], bg);

           int format = SCREEN_FORMAT_RGB888;
           int size[2] = {1280, 768};
           screen_create_pixmap(&screen_pix, screen_ctx); // TODO: Check failure
           screen_set_pixmap_property_iv(screen_pix, SCREEN_PROPERTY_FORMAT, &format);
           usage = SCREEN_USAGE_WRITE | SCREEN_USAGE_NATIVE;
           screen_set_pixmap_property_iv(screen_pix, SCREEN_PROPERTY_USAGE, &usage);
           screen_set_pixmap_property_iv(screen_pix, SCREEN_PROPERTY_BUFFER_SIZE, size);
           screen_create_pixmap_buffer(screen_pix);

           char *realPixels;
           int realStride;
           screen_get_pixmap_property_pv(screen_pix, SCREEN_PROPERTY_RENDER_BUFFERS, (void**)&screen_pbuf);
           screen_get_buffer_property_pv(screen_pbuf, SCREEN_PROPERTY_POINTER, (void **)&realPixels);
           //screen_get_buffer_property_iv(screen_pbuf, SCREEN_PROPERTY_STRIDE, &realStride);

           JPEG_read_data(JPEG_open("/usr/local/share/images/48.jpg"), realPixels);

           int hg[] = {
              SCREEN_BLIT_SOURCE_WIDTH, 1280,
              SCREEN_BLIT_SOURCE_HEIGHT, 768,
              SCREEN_BLIT_DESTINATION_X, 0,
              SCREEN_BLIT_DESTINATION_Y, 0,
              SCREEN_BLIT_DESTINATION_WIDTH, 1280,
              SCREEN_BLIT_DESTINATION_HEIGHT, 768,
              SCREEN_BLIT_TRANSPARENCY, SCREEN_TRANSPARENCY_SOURCE_OVER,
              SCREEN_BLIT_END
           };

           screen_blit(screen_ctx, screen_buf[0], screen_pbuf, hg);
           screen_post_window(screen_win, screen_buf[0], 1, rect, 0);
           while(1){
           }

           return (0);
        }
沙爹

我发现我的问题的答案很快。现在,我不使用libjpeg,而是使用libimg,它使用jpeg解码器(img_codec_jpg.so),并为qnx的所有解码器提供通用的api。这是工作代码-

           #include <stdio.h>
           #include <stdlib.h>
           #include <jpeglib.h>
           #include <jpegint.h>

           #ifdef __QNX__
           #include <time.h>
           #include <screen/screen.h>
           #include <png.h>
           #include <sys/netmgr.h>
           #include <sys/neutrino.h>
           #include <dirent.h>
           #include <img/img.h>
           #endif

           screen_context_t screen_ctx;
           screen_window_t screen_win;
           const char* img_path = "usr/local/share/images/48.jpg"; /* Relative path to image asset */
           int viewport_size[2] = { 0, 0 };


           static int decode_setup(uintptr_t data, img_t *img, unsigned flags)
           {
               screen_window_t screen_win = (screen_window_t)data;
               screen_buffer_t screen_buf;
               int size[2];

               size[0] = img->w;
               size[1] = img->h;
               screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size);
               screen_create_window_buffers(screen_win, 1);

               screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_buf);
               screen_get_buffer_property_pv(screen_buf, SCREEN_PROPERTY_POINTER, (void **)&img->access.direct.data);
               screen_get_buffer_property_iv(screen_buf, SCREEN_PROPERTY_STRIDE, (int *)&img->access.direct.stride);

               img->flags |= IMG_DIRECT;
               return IMG_ERR_OK;
           }

           static void decode_abort(uintptr_t data, img_t *img)
           {
               screen_window_t screen_win = (screen_window_t)data;
               screen_destroy_window_buffers(screen_win);
           }

           int load_image(screen_window_t screen_win, const char *path)
           {
               img_decode_callouts_t callouts;
               img_lib_t ilib = NULL;
               img_t img;
               int rc;

               rc = img_lib_attach(&ilib);
               if (rc != IMG_ERR_OK) {
                  printf("Failed to load lib \n");
                   return -1;
               }

               memset(&img, 0, sizeof(img));
               img.flags |= IMG_FORMAT;
               img.format = IMG_FMT_PKLE_XRGB8888;

               memset(&callouts, 0, sizeof(callouts));
               callouts.setup_f = decode_setup;
               callouts.abort_f = decode_abort;
               callouts.data = (uintptr_t)screen_win;

               rc = img_load_file(ilib, path, &callouts, &img);
               img_lib_detach(ilib);

               return rc == IMG_ERR_OK ? 0 : -1;
           }



           int main(int argc, char **argv)
           {
               const int usage = SCREEN_USAGE_WRITE;

               screen_buffer_t screen_buf = NULL;
               int rect[4] = { 0, 0, 0, 0 };

               /* Setup the window */
               screen_create_context(&screen_ctx, 0);
               screen_create_window(&screen_win, screen_ctx);
               screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_USAGE, &usage);

               load_image(screen_win, img_path);

               screen_get_window_property_pv(screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&screen_buf);
               screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_BUFFER_SIZE, rect+2);
               viewport_size[0] = rect[2];
               viewport_size[1] = rect[3];
               screen_set_window_property_iv(screen_win, SCREEN_PROPERTY_SOURCE_SIZE , viewport_size);

               screen_post_window(screen_win, screen_buf, 1, rect, 0);


               while(1){

               }
           }

如果对您有帮助,请发表评论。或让我知道您是否仍然面临问题。谢谢,萨蒂什

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在弹出窗口上显示图像

来自分类Dev

CreateBitmap 图像未打印在窗口上

来自分类Dev

如何在不同的信息窗口上显示不同的图像

来自分类Dev

如何在tkinter窗口上的图像上绘制线条?

来自分类Dev

使用CUDA OpenGL在单个窗口上显示不同大小的图像

来自分类Dev

图像视图在Android中的键盘弹出窗口上缩小

来自分类Dev

使用ImageMagick在根窗口上显示多个图像

来自分类Dev

通过WPF窗口上的图像控件进行Foreach循环

来自分类Dev

在弹出窗口上预览图像,显示不正确

来自分类Dev

如何在名称为 I 的顶级窗口上显示图像

来自分类Dev

在页面中的每个图像弹出窗口上添加动态文本框以进行图像描述

来自分类Dev

窗口上的Pyspark StandardScaler

来自分类Dev

在cmd窗口上的Git

来自分类Dev

tkinter图片错误:“图像的名称可能与主窗口上的名称不同”

来自分类Dev

在对话框/弹出窗口上加载图像时,ANDROID进度对话框

来自分类Dev

在单个窗口上显示多个图像无法正常工作(C ++ VS12)

来自分类Dev

图像文件夹在天蓝色的窗口上覆盖

来自分类Dev

单击使用Javascript的选择按钮时,在另一个窗口上显示图像

来自分类Dev

iOS上的弹出窗口上显示图像,具体取决于单击的UIButton

来自分类Dev

在桌面上/所有窗口上方覆盖半透明图像

来自分类Dev

在单个窗口上显示多个图像无法正常工作(C ++ VS12)

来自分类Dev

图像绑定在重新加载窗口上不起作用

来自分类Dev

如何在同一Tkinter Toplevel()窗口上显示两个图像

来自分类Dev

在海燕地图窗口上绘图

来自分类Dev

WPF窗口上的渲染线

来自分类Dev

在动态窗口上滚动总和

来自分类Dev

获取窗口上的总行数

来自分类Dev

在海燕地图窗口上绘图

来自分类Dev

在模态窗口上创建cookie

Related 相关文章

  1. 1

    在弹出窗口上显示图像

  2. 2

    CreateBitmap 图像未打印在窗口上

  3. 3

    如何在不同的信息窗口上显示不同的图像

  4. 4

    如何在tkinter窗口上的图像上绘制线条?

  5. 5

    使用CUDA OpenGL在单个窗口上显示不同大小的图像

  6. 6

    图像视图在Android中的键盘弹出窗口上缩小

  7. 7

    使用ImageMagick在根窗口上显示多个图像

  8. 8

    通过WPF窗口上的图像控件进行Foreach循环

  9. 9

    在弹出窗口上预览图像,显示不正确

  10. 10

    如何在名称为 I 的顶级窗口上显示图像

  11. 11

    在页面中的每个图像弹出窗口上添加动态文本框以进行图像描述

  12. 12

    窗口上的Pyspark StandardScaler

  13. 13

    在cmd窗口上的Git

  14. 14

    tkinter图片错误:“图像的名称可能与主窗口上的名称不同”

  15. 15

    在对话框/弹出窗口上加载图像时,ANDROID进度对话框

  16. 16

    在单个窗口上显示多个图像无法正常工作(C ++ VS12)

  17. 17

    图像文件夹在天蓝色的窗口上覆盖

  18. 18

    单击使用Javascript的选择按钮时,在另一个窗口上显示图像

  19. 19

    iOS上的弹出窗口上显示图像,具体取决于单击的UIButton

  20. 20

    在桌面上/所有窗口上方覆盖半透明图像

  21. 21

    在单个窗口上显示多个图像无法正常工作(C ++ VS12)

  22. 22

    图像绑定在重新加载窗口上不起作用

  23. 23

    如何在同一Tkinter Toplevel()窗口上显示两个图像

  24. 24

    在海燕地图窗口上绘图

  25. 25

    WPF窗口上的渲染线

  26. 26

    在动态窗口上滚动总和

  27. 27

    获取窗口上的总行数

  28. 28

    在海燕地图窗口上绘图

  29. 29

    在模态窗口上创建cookie

热门标签

归档