2014-03-28 52 views
0

我想要一个bmp图像转换成PNG一个与此代码:错误:LNK1120:9周解析的外部

#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; 
} 

执行此代码触发这些错误:

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 *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_create_write_struct referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_destroy_write_struct referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_free referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_init_io referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_malloc referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_set_IHDR referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_set_rows referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

LNK2019: unresolved external symbol _png_write_png referenced in function "int __cdecl save_png_to_file(struct _RGBBitmap *,char const *)" ([email protected]@[email protected]@[email protected])

我米无法找到如何解决这些错误。请有任何精彩的建议吗?

我目前在Windows 7 SP1平台上使用Visual Studio Ultimate 2013。

非常感谢!

+0

你*已*安装了[PNG库](http://www.libpng.org/pub/png/libpng.html)?并将其添加到您的项目? –

+0

@JoachimPileborg,没错。 – user3471387

+1

看来你正在使用libpng而不添加库。在菜单“PROJECT - >属性 - >连接器 - >输入 - >附加依赖项”中添加“libpng.lib”并确保库目录具有libpng目录。 – rookiepig

回答

0

我想,你没有链接你的库,只是包含头文件。 This question anwers你怎么办呢?

如果不是,有plently的可能发生的事情:

  • 你试图调用这些函数不好参数
  • 你包括坏的头文件
  • 你已经混库,或者你正在尝试链接的MinGW,VS2012/VS2012编译库VS2013的编译器,因为我不知道他们是否兼容...

你可以尝试download png库,创建VS2012项目并尝试编译它。当你这样做时,你应该绝对没有问题,当链接...

相关问题