Hi All, I myself fixed this issue in PODOFO.
Issue : Transparency mask is stripped off and not exported as smask. Solution : I have converted 8 bit images to RGBA image and convert the transparency stream as a /smask stream in pdf. Tested with 8 bit pallete transparency image and RGBA transparency images I dont know how to merge this changes to PODOFO codebase. void PdfImage::LoadFromPng(const char* pszFilename) { if( !pszFilename ) { PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } FILE* hFile = fopen(pszFilename, "rb"); if( !hFile ) { PODOFO_RAISE_ERROR_INFO( ePdfError_FileNotFound, pszFilename ); } png_byte header[8]; fread(header, 1, 8, hFile); if( png_sig_cmp(header, 0, 8) ) { fclose( hFile ); PODOFO_RAISE_ERROR_INFO( ePdfError_UnsupportedImageFormat, "The file could not be recognized as a PNG file." ); } png_structp pPng = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if( !pPng ) { fclose( hFile ); PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } png_infop pInfo = png_create_info_struct(pPng); if( !pInfo ) { png_destroy_read_struct(&pPng, (png_infopp)NULL, (png_infopp)NULL); fclose( hFile ); PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } if( setjmp(png_jmpbuf(pPng)) ) { png_destroy_read_struct(&pPng, &pInfo, (png_infopp)NULL); fclose( hFile ); PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } png_init_io(pPng, hFile); png_set_sig_bytes(pPng, 8); png_read_info(pPng, pInfo); // Begin png_uint_32 width; png_uint_32 height; int depth; int color_type; int interlace; png_get_IHDR (pPng, pInfo, &width, &height, &depth, &color_type, &interlace, NULL, NULL); /* convert palette/gray image to rgb */ if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(pPng); if( color_type == PNG_COLOR_TYPE_GRAY_ALPHA ) png_set_gray_to_rgb(pPng); #if 0 /* expand gray bit depth if needed */ if (color_type == PNG_COLOR_TYPE_GRAY) { #if PNG_LIBPNG_VER >= 10209 png_set_expand_gray_1_2_4_to_8 (pPng); #else png_set_gray_1_2_4_to_8 (pPng); #endif } #endif /* transform transparency to alpha */ if (png_get_valid (pPng, pInfo, PNG_INFO_tRNS)) png_set_tRNS_to_alpha (pPng); if (depth == 16) png_set_strip_16(pPng); if (depth < 8) png_set_packing(pPng); #if 0 /* convert grayscale to RGB */ if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { png_set_gray_to_rgb (pPng); } #endif if (interlace != PNG_INTERLACE_NONE) png_set_interlace_handling(pPng); //png_set_filler (pPng, 0xff, PNG_FILLER_AFTER); /* recheck header after setting EXPAND options */ png_read_update_info(pPng, pInfo); png_get_IHDR (pPng, pInfo, &width, &height, &depth, &color_type, &interlace, NULL, NULL); // End // // Read the file if( setjmp(png_jmpbuf(pPng)) ) { png_destroy_read_struct(&pPng, &pInfo, (png_infopp)NULL); fclose( hFile ); PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } long lLen = static_cast<long>(png_get_rowbytes(pPng, pInfo) * height); char* pBuffer = static_cast<char*>(malloc(sizeof(char) * lLen)); png_bytepp pRows = NULL; if (pBuffer) { pRows = static_cast<png_bytepp>(malloc(sizeof(png_bytep)*height)); if (pRows) { for (unsigned int y = 0; y < height; y++) { pRows[y] = reinterpret_cast<png_bytep>(pBuffer + (y * png_get_rowbytes(pPng, pInfo))); } png_read_image(pPng, pRows); png_bytep *row_ptr, row; row_ptr = pRows; char* smask_data = static_cast<char*>(malloc(sizeof(char) * (width*height))); if (smask_data) { int row_len = 3 * width * sizeof(png_byte); for (int j = 0; j < height; j++) { row = pRows[j]; for (int i = 0; i < width; i++) { smask_data[width * j + i] = row[4 * i + 3]; } } char* image_data_ptr = pBuffer; for (int i = 0; i < width*height; i++) { memmove(image_data_ptr + (3 * i), image_data_ptr + (4 * i), 3); } fclose(hFile); m_rRect.SetWidth(width); m_rRect.SetHeight(height); this->SetImageColorSpace(ePdfColorSpace_DeviceRGB); // Set the image data and flate compress it PdfMemoryInputStream stream(pBuffer, row_len * height); this->SetImageData(width, height, depth, &stream); PdfMemoryInputStream smaskstream(smask_data, width * height); PdfImage smakeImage(this->pCurDocParent); smakeImage.SetImageColorSpace(ePdfColorSpace_DeviceGray); smakeImage.SetImageData(width, height, depth, &smaskstream); this->SetImageSoftmask(&smakeImage); } free(smask_data); } } free(pBuffer); free(pRows); png_destroy_read_struct(&pPng, &pInfo, (png_infopp)NULL); } On Fri, Aug 7, 2015 at 4:23 PM, ram yd <ydramku...@gmail.com> wrote: > Hi > > In our project, we are using PODOFO library to create PDF file. When I was > trying to add the PNG image with transparency, it exported the png image > without transparency in PDF file. > > Further analysis shows that PODOFO lib is converting transparency to alpha > channel. But similar code is not exist in LibHaru. Libharu exporting the > transparency mask as xref. > > Please let me know, how to export transparency png image by using PODOFO. > > > -- > Regards, > Ramkumar Y.D > -- Regards, Ramkumar Y.D
------------------------------------------------------------------------------
_______________________________________________ Podofo-users mailing list Podofo-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/podofo-users