使用 libjpeg 库而不是 ijl15.lib 的 WriteJPGBuffer 方法

WriteJPGBuffer method using libjpeg libraries instead of ijl15.lib

我们使用 ijl15.lib API 实现了以下方法。 我们想使用 libjpeg 库而不是 ijl。我应该如何使用 libjpeg 库实现 WriteJPGBuffer?我们知道文件中的 LoadJPG 和 SaveJPG。但是我想使用 libjpeg 库在缓冲区中写入和读取 jpg 图像。任何输入都会非常有帮助。提前谢谢你。

   unsigned char WriteJPGBuffer(unsigned int &size)
    {
      size = 0;
      int jErr;
      JPEG_CORE_PROPERTIES jpgProps;
      bool colorsSwapped;

      if (!jpgSupported)  
        return NULL;

      jErr = ijlInit(&jpgProps);
      if (jErr != IJL_OK)
        return NULL;


      jpgProps.DIBWidth = m_width;
      jpgProps.DIBHeight = -m_height;
      jpgProps.DIBBytes = (unsigned char *)m_pData;
      jpgProps.DIBPadBytes = 0 ;     
      jpgProps.DIBChannels = 4;
      jpgProps.DIBColor = IJL_RGB;

      jpgProps.JPGFile = NULL;
      jpgProps.JPGWidth = m_width;
      jpgProps.JPGHeight = m_height;
      jpgProps.JPGChannels = 3;
      jpgProps.JPGColor = IJL_YCBCR;
      jpgProps.JPGSubsampling = IJL_411;
      jpgProps.jquality = jpgQuality;   
      unsigned int iSize = m_width*m_height*3;
      unsigned char * pBuffer = new unsigned char[iSize];
      jpgProps.JPGSizeBytes = iSize;
      jpgProps.JPGBytes = pBuffer;

      jpgProps.jprops.jpeg_comment_size = (unsigned short)m_strCommentAdobe.length;
      jpgProps.jprops.jpeg_comment = (char*)m_strCommentAdobe;

      colorsSwapped = SetInternalFormat(RGB);

      jErr = ijlWrite(&jpgProps, IJL_JBUFF_WRITEWHOLEIMAGE);

      if (colorsSwapped)
        SetInternalFormat(BGR);

      if (jErr != IJL_OK)
      {
        ijlFree(&jpgProps);
        return NULL;
      }

      size = jpgProps.JPGSizeBytes;

      ijlFree(&jpgProps);

      return jpgProps.JPGBytes;
    }

感谢您的意见。我已经通过 RND 实现了以下解决方案。在下面的实现中,我们将图像数据以 RGBQUAD 的形式存储在 class 成员变量中,我首先使用 ConversionfromGLRGBQUADToUnsignedChar 函数将其转换为 unsigned char*,然后将其写入 jpeg 缓冲区。

void ConversionfromGLRGBQUADToUnsignedChar(unsigned char* dataInCharFromGLRGBQUAD)
{
    int spot,spotDst;
    for (int y = 0;y < m_height;y++)
    {
        for (int x = 0;x<m_width;x++)
        {
            spot = y * m_width + x;
            spotDst = spot * 3;
            dataInCharFromGLRGBQUAD[spotDst] = m_pData[spot].red;
            dataInCharFromGLRGBQUAD[spotDst + 1] = m_pData[spot].green;
            dataInCharFromGLRGBQUAD[spotDst + 2] = m_pData[spot].blue;
        }
    }
}



unsigned char * WriteJPGBuffer(unsigned int &size)
    {
       size = 0;
       struct jpeg_compress_struct cinfo;
       struct jpeg_error_mgr jerr;
       JSAMPROW row_pointer[1];
       unsigned char* dataInCharFromGLRGBQUAD;
       bool colorsSwapped;
       int row_stride;

       cinfo.err = jpeg_std_error(&jerr);
       jpeg_create_compress(&cinfo);

       unsigned long sizeOfJPGBuffer = 0;

       jpeg_mem_dest(&cinfo, &m_pDIBData, &sizeOfJPGBuffer);

       cinfo.image_width = m_width;
       cinfo.image_height = m_height;
       cinfo.input_components = 3;
       cinfo.in_color_space = JCS_RGB;

       cinfo.jpeg_color_space = JCS_YCbCr;

       jpeg_set_defaults(&cinfo);
       jpeg_set_quality(&cinfo, jpgQuality, true);
       jpeg_start_compress(&cinfo, true);

       colorsSwapped = SetInternalFormat(RGB);

       FlipVert();

       dataInCharFromGLRGBQUAD = new unsigned char[m_width*m_height*3];
       ConversionfromGLRGBQUADToUnsignedChar(dataInCharFromGLRGBQUAD);

       row_stride = cinfo.image_width * cinfo.input_components;

       while (cinfo.next_scanline < cinfo.image_height) 
       {
            row_pointer[0] = &dataInCharFromGLRGBQUAD[cinfo.next_scanline * row_stride];
            jpeg_write_scanlines(&cinfo, row_pointer, 1);
       }

       if (colorsSwapped)
           SetInternalFormat(BGR);

       jpeg_finish_compress(&cinfo);
       jpeg_destroy_compress(&cinfo);

       size = sizeOfJPGBuffer;
       delete[] dataInCharFromGLRGBQUAD;

       return m_pDIBData;
    }