General > The Laboratory

libpng

(1/5) > >>

Biterider:
Hi
Tired of taking a detour with GDI+ to load a PNG, I tried to build a static library (x86/x64) from the original authors of the format http://www.libpng.org/ .
Building the library wasn't that difficult. I used an existing Visual Studio project and changed to project configuration for my purposes.
Creating the include file will still require some work, but one problem I'm facing is that I need to include C runtime stuff, which I don't want.
Has anyone succeeded? Has anyone been able to set up the library?  :rolleyes:

Biterider

fearless:
Yeh a lot of libraries make use of C runtime stuff, which is alway a pain to deal with tbh.

Came across this repo a while back that might be useful: https://github.com/Chuyu-Team/VC-LTL5


--- Quote ---VC-LTL is an open source CRT library based on the MS VCRT that reduce program binary size and say goodbye to Microsoft runtime DLLs, such as msvcr120.dll, api-ms-win-crt-time-l1-1-0.dll and other dependencies.
--- End quote ---

hutch--:
I confess I don't see the problem with loading JPG PNG and a few other formats with GDI+. Just bundle it into a reusable library and you are free of external DLLs and libraries.

LiaoMi:

--- Quote from: Biterider on October 10, 2022, 12:22:48 AM ---Hi
Tired of taking a detour with GDI+ to load a PNG, I tried to build a static library (x86/x64) from the original authors of the format http://www.libpng.org/ .
Building the library wasn't that difficult. I used an existing Visual Studio project and changed to project configuration for my purposes.
Creating the include file will still require some work, but one problem I'm facing is that I need to include C runtime stuff, which I don't want.
Has anyone succeeded? Has anyone been able to set up the library?  :rolleyes:

Biterider

--- End quote ---

Hi Biterider,

my results:

--- Code: ---Severity Code Description Project File Line Suppression State
Error LNK2001 unresolved external symbol _printf pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _png_image_begin_read_from_file pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _malloc pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _malloc pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngmem.obj) 1
Error LNK2001 unresolved external symbol _png_image_write_to_file pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _free pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _free pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol _free pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngmem.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngwutil.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngmem.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngset.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngrutil.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngwrite.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngread.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol _memset pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngrtran.obj) 1
Error LNK2001 unresolved external symbol _memcpy pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngwrite.obj) 1
Error LNK2001 unresolved external symbol _memcpy pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngwutil.obj) 1
Error LNK2001 unresolved external symbol _memcpy pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngread.obj) 1
Error LNK2001 unresolved external symbol _memcpy pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngmem.obj) 1
Error LNK2001 unresolved external symbol _memcpy pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngset.obj) 1
Error LNK2001 unresolved external symbol _memcpy pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngrutil.obj) 1
Error LNK2001 unresolved external symbol _longjmp pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol _longjmp pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngerror.obj) 1
Error LNK2001 unresolved external symbol _frexp pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol _modf pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol __CIpow pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol __setjmp3 pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol __setjmp3 pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngerror.obj) 1
Error LNK2001 unresolved external symbol _floor pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(png.obj) 1
Error LNK2001 unresolved external symbol _floor pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngrtran.obj) 1
Error LNK2001 unresolved external symbol _abort pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngerror.obj) 1
Error LNK2001 unresolved external symbol _atof pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngget.obj) 1
Error LNK2001 unresolved external symbol __gmtime64 pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\libpng16.lib(pngwrite.obj) 1
Error LNK1120 16 unresolved externals pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\Release Library\pngtest.exe 1

--- End code ---

together with a external library msvcrt.lib


--- Code: ---Severity Code Description Project File Line Suppression State
Error LNK2001 unresolved external symbol _png_image_begin_read_from_file pngtest U:\\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK2001 unresolved external symbol _png_image_write_to_file pngtest U:\\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK1120 2 unresolved externals pngtest U:\\LIBPNG\libpng-libpng16\projects\vstudio\Release Library\pngtest.exe 1
--- End code ---

Because of  :tongue:

--- Code: ---/* READ APIs
 * ---------
 *
 * The png_image passed to the read APIs must have been initialized by setting
 * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.)
 */
#ifdef PNG_STDIO_SUPPORTED
PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image,
   const char *file_name));
   /* The named file is opened for read and the image header is filled in
    * from the PNG header in the file.
    */
--- End code ---

Source "Test"

--- Code: ---#define _NO_CRT_STDIO_INLINE //First String in Source Code!!!
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include "png.h"
//#include <stdlib.h>
#include <string.h>

//extern C
//{
int _fltused;

//#ifdef _M_IX86 // following functions are needed only for 32-bit architecture

__declspec(naked) void _ftol2()
{
__asm
{
fistp qword ptr[esp - 8]
mov   edx, [esp - 4]
mov   eax, [esp - 8]
ret
}
}

__declspec(naked) void _ftol2_sse()
{
__asm
{
fistp dword ptr[esp - 4]
mov   eax, [esp - 4]
ret
}
}

//#endif
//}

int mainCRTStartup()
{
png_image image;
memset(&image, 0, sizeof(png_image));

image.version = PNG_IMAGE_VERSION;

int result = png_image_begin_read_from_file(&image, "reona_unknown.png");
printf("Read result: %d\r\n", result);

printf("Width: %d, Height: %d\r\n", image.width, image.height);

image.format = PNG_FORMAT_RGBA;

int row_stride = PNG_IMAGE_ROW_STRIDE(image);
int px_size = PNG_IMAGE_PIXEL_COMPONENT_SIZE(PNG_FORMAT_RGBA);

int stride_bytes = row_stride * px_size;
printf("Row stride: %d, pixel size: %d, stride in bytes: %d\r\n", row_stride, px_size, stride_bytes);

int size = PNG_IMAGE_SIZE(image);
printf("Size: %d\r\n", size);

char* buffer = (char*)malloc(size);
memset(buffer, 0, size);

result = png_image_finish_read(&image, NULL, buffer, row_stride, NULL);
printf("Read result: %d\r\n", result);

png_image w_image;
memset(&w_image, 0, sizeof(png_image));

w_image.version = PNG_IMAGE_VERSION;
w_image.width = image.width;
w_image.height = image.height;
w_image.format = image.format;

png_image_write_to_file(&w_image, "reona_w_unknown.png", 0, buffer, row_stride, NULL);

png_image_free(&w_image);
png_image_free(&image);

free(buffer);

return 0;
}

/* Generate a compiler error if there is an old png.h in the search path. */
typedef png_libpng_version_1_6_39_git Your_png_h_is_not_version_1_6_39_git;
--- End code ---

LiaoMi:
Second example  :biggrin:


--- Code: ---#define _NO_CRT_STDIO_INLINE //First String in Source Code!!!
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include "png.h"
//#include <stdlib.h>
#include <string.h>

//extern C
//{
int _fltused;

//#ifdef _M_IX86 // following functions are needed only for 32-bit architecture

__declspec(naked) void _ftol2()
{
__asm
{
fistp qword ptr[esp - 8]
mov   edx, [esp - 4]
mov   eax, [esp - 8]
ret
}
}

__declspec(naked) void _ftol2_sse()
{
__asm
{
fistp dword ptr[esp - 4]
mov   eax, [esp - 4]
ret
}
}

//#endif
//}

/*
 * A simple libpng example program
 * http://zarb.org/~gc/html/libpng.html
 *
 * Modified by Yoshimasa Niwa to make it much simpler
 * and support all defined color_type.
 *
 * To build, use the next instruction on OS X.
 * $ brew install libpng
 * $ clang -lz -lpng16 libpng_test.c
 *
 * Copyright 2002-2010 Guillaume Cottenceau.
 *
 * This software may be freely redistributed under the terms
 * of the X11 license.
 *
 */

//#include <stdlib.h>
//#include <stdio.h>

int width, height;
png_byte color_type;
png_byte bit_depth;
png_bytep *row_pointers = NULL;

void read_png_file(char *filename) {
  FILE *fp = fopen(filename, "rb");

  png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  if(!png) abort();

  png_infop info = png_create_info_struct(png);
  if(!info) abort();

  if(setjmp(png_jmpbuf(png))) abort();

  //Description
  //Initialize the default input / output functions for the PNG file to standard C streams.To replace the default readand write functions, use png_set_read_fn() and png_set_write_fn() respectively.

  png_init_io(png, fp);

  png_read_info(png, info);


  width      = png_get_image_width(png, info);
  height     = png_get_image_height(png, info);
  color_type = png_get_color_type(png, info);
  bit_depth  = png_get_bit_depth(png, info);

  // Read any color_type into 8bit depth, RGBA format.
  // See http://www.libpng.org/pub/png/libpng-manual.txt

  if(bit_depth == 16)
    png_set_strip_16(png);

  if(color_type == PNG_COLOR_TYPE_PALETTE)
    png_set_palette_to_rgb(png);

  // PNG_COLOR_TYPE_GRAY_ALPHA is always 8 or 16bit depth.
  if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
    png_set_expand_gray_1_2_4_to_8(png);

  if(png_get_valid(png, info, PNG_INFO_tRNS))
    png_set_tRNS_to_alpha(png);

  // These color_type don't have an alpha channel then fill it with 0xff.
  if(color_type == PNG_COLOR_TYPE_RGB ||
     color_type == PNG_COLOR_TYPE_GRAY ||
     color_type == PNG_COLOR_TYPE_PALETTE)
    png_set_filler(png, 0xFF, PNG_FILLER_AFTER);

  if(color_type == PNG_COLOR_TYPE_GRAY ||
     color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
    png_set_gray_to_rgb(png);

  png_read_update_info(png, info);

  if (row_pointers) abort();

  row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
  for(int y = 0; y < height; y++) {
    row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png,info));
  }

  png_read_image(png, row_pointers);

  fclose(fp);

  png_destroy_read_struct(&png, &info, NULL);
}

void write_png_file(char *filename) {
  int y;

  FILE *fp = fopen(filename, "wb");
  if(!fp) abort();

  png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  if (!png) abort();

  png_infop info = png_create_info_struct(png);
  if (!info) abort();

  if (setjmp(png_jmpbuf(png))) abort();

  png_init_io(png, fp);

  // Output is 8bit depth, RGBA format.
  png_set_IHDR(
    png,
    info,
    width, height,
    8,
    PNG_COLOR_TYPE_RGBA,
    PNG_INTERLACE_NONE,
    PNG_COMPRESSION_TYPE_DEFAULT,
    PNG_FILTER_TYPE_DEFAULT
  );
  png_write_info(png, info);

  // To remove the alpha channel for PNG_COLOR_TYPE_RGB format,
  // Use png_set_filler().
  //png_set_filler(png, 0, PNG_FILLER_AFTER);

  if (!row_pointers) abort();

  png_write_image(png, row_pointers);
  png_write_end(png, NULL);

  for(int y = 0; y < height; y++) {
    free(row_pointers[y]);
  }
  free(row_pointers);

  fclose(fp);

  png_destroy_write_struct(&png, &info);
}

void process_png_file() {
  for(int y = 0; y < height; y++) {
    png_bytep row = row_pointers[y];
    for(int x = 0; x < width; x++) {
      png_bytep px = &(row[x * 4]);
      // Do something awesome for each pixel here...
      //printf("%4d, %4d = RGBA(%3d, %3d, %3d, %3d)\n", x, y, px[0], px[1], px[2], px[3]);
    }
  }
}

int mainCRTStartup(int argc, char *argv[]) {
  if(argc != 3) abort();

  read_png_file(argv[1]);
  process_png_file();
  write_png_file(argv[2]);

  return 0;
}

/* Generate a compiler error if there is an old png.h in the search path. */
typedef png_libpng_version_1_6_39_git Your_png_h_is_not_version_1_6_39_git;

--- End code ---

Here we also get an error related to the removal of the standard library

--- Code: ---Severity Code Description Project File Line Suppression State
Error LNK2001 unresolved external symbol _png_init_io pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\pngtest\pngtest.obj 1
Error LNK1120 1 unresolved externals pngtest U:\LIBPNG\libpng-libpng16\projects\vstudio\Release Library\pngtest.exe 1
--- End code ---

The reason is described in the documentation:
#ifdef PNG_STDIO_SUPPORTED
/* Initialize the input/output for the PNG file to the default functions. */
PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp));
#endif

Description
Initialize the default input/output functions for the PNG file to standard C streams. To replace the default read and write functions, use png_set_read_fn() and png_set_write_fn() respectively.

Navigation

[0] Message Index

[#] Next page

Go to full version