0
votes

I'm trying to convert a bmp image to a png one with this code:

#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_DEPRECATE

#include <png.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

void GetDesktopResolution(int& horizontal, int& vertical)
{
    RECT desktop;
    // Get a handle to the desktop window
    const HWND hDesktop = GetDesktopWindow();
    // Get the size of screen to the variable desktop
    GetWindowRect(hDesktop, &desktop);
    // The top left corner will have coordinates (0,0)
    // and the bottom right corner will have coordinates
    // (horizontal, vertical)
    horizontal = desktop.right;
    vertical = desktop.bottom;
}

typedef struct _RGBPixel {
    uint8_t blue;
    uint8_t green;
    uint8_t red;
} RGBPixel;

/* Structure for containing decompressed bitmaps. */
typedef struct _RGBBitmap {
    RGBPixel *pixels;
    size_t width;
    size_t height;
    size_t bytewidth;
    uint8_t bytes_per_pixel;
} RGBBitmap;

/* Returns pixel of bitmap at given point. */
#define RGBPixelAtPoint(image, x, y) \
    *(((image)->pixels) + (((image)->bytewidth * (y)) \
                        + ((x) * (image)->bytes_per_pixel)))

/* Attempts to save PNG to file; returns 0 on success, non-zero on error. */
int save_png_to_file(RGBBitmap *bitmap, const char *path)
{
    FILE *fp = fopen(path, "wb");
    png_structp png_ptr = NULL;
    png_infop info_ptr = NULL;
    size_t x, y;
    png_uint_32 bytes_per_row;
    png_byte **row_pointers = NULL;

    if (fp == NULL) return -1;

    /* Initialize the write struct. */
    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (png_ptr == NULL) {
        fclose(fp);
        return -1;
    }

    /* Initialize the info struct. */
    info_ptr = png_create_info_struct(png_ptr);
    if (info_ptr == NULL) {
        png_destroy_write_struct(&png_ptr, NULL);
        fclose(fp);
        return -1;
    }

    /* Set up error handling. */
    if (setjmp(png_jmpbuf(png_ptr))) {
        png_destroy_write_struct(&png_ptr, &info_ptr);
        fclose(fp);
        return -1;
    }

    /* Set image attributes. */
    png_set_IHDR(png_ptr,
                 info_ptr,
                 bitmap->width,
                 bitmap->height,
                 8,
                 PNG_COLOR_TYPE_RGB,
                 PNG_INTERLACE_NONE,
                 PNG_COMPRESSION_TYPE_DEFAULT,
                 PNG_FILTER_TYPE_DEFAULT);

    /* Initialize rows of PNG. */
    bytes_per_row = bitmap->width * bitmap->bytes_per_pixel;
    png_malloc(png_ptr, bitmap->height * sizeof(png_byte *));
    for (y = 0; y < bitmap->height; ++y) {
        uint8_t *row = (uint8_t *)png_malloc(png_ptr, sizeof(uint8_t)* bitmap->bytes_per_pixel);
        row_pointers[y] = (png_byte *)row;
        for (x = 0; x < bitmap->width; ++x) {
            RGBPixel color = RGBPixelAtPoint(bitmap, x, y);
            *row++ = color.red;
            *row++ = color.green;
            *row++ = color.blue;
        }
    }

    /* Actually write the image data. */
    png_init_io(png_ptr, fp);
    png_set_rows(png_ptr, info_ptr, row_pointers);
    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);

    /* Cleanup. */
    for (y = 0; y < bitmap->height; y++) {
        png_free(png_ptr, row_pointers[y]);
    }
    png_free(png_ptr, row_pointers);

    /* Finish writing. */
    png_destroy_write_struct(&png_ptr, &info_ptr);
    fclose(fp);
    return 0;
}

int main()
{
        RGBBitmap rgbbitmap;
    int w, h;
    GetDesktopResolution(w, h);
    rgbbitmap.height = h;
    rgbbitmap.width = w;
    rgbbitmap.bytes_per_pixel = 1;
    rgbbitmap.bytewidth = w / 100;

    RGBPixel rgbpixel;
    rgbpixel.blue = 100;
    rgbpixel.green = 100;
    rgbpixel.red = 100;
    rgbbitmap.pixels = &rgbpixel;

    save_png_to_file(&rgbbitmap, "abc.bmp");

        return 0;
}

Executing this code triggers these errors :

LNK1120: 9 unresolved externals

LNK2019: unresolved external symbol _png_create_info_struct referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_create_write_struct referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_destroy_write_struct referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_free referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_init_io referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_malloc referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_set_IHDR referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_set_rows referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

LNK2019: unresolved external symbol _png_write_png referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" (?save_png_to_file@@YAHPAU_RGBBitmap@@PBD@Z)

I'm not able to find how to fix these errors. Any brilliant suggestion, please?

I'm currently using Visual Studio Ultimate 2013 on a Windows 7 SP1 plateform.

Thanks a lot!

1
You have installed a PNG Library? And added it to your project?Some programmer dude
@JoachimPileborg, yes that's fine.user3471387
It seems you are using libpng without adding the library. In Menus "PROJECT -> Properties -> Linker -> Input -> Additional Dependencies" add "libpng.lib" and make sure that library directories have your libpng directory.rookiepig
@rookiepig, doing that triggers another problem The program can't start because libpng12.dll is missing from your computer. How to fix it please?user3471387
Sorry, miss one thing. To solve this you can copy that dll to your project folder. Another solution is add the "bin" path of libpng to your project's executable directory or windows system path.rookiepig

1 Answers

0
votes

I think, you didn't linked your libraries, just included headers. This question anwers how you do it...

If not, there is plently of what can happen:

  • you are trying to call those functions with bad parameters
  • you included bad header file
  • you have mixed libraries or you are trying to link MinGW, VS2012/VS2012 compiled library to VS2013 compiler, since i don't know if they are compatible...

You can try to download png library, create VS2012 project and try to compile it. When you do, you should absolutely have no problems while linking...