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 <[email protected]> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/podofo-users