libpng安装与配置(Win7+VS2010)

一、下载

libpng:http://libmng.com/pub/png/libpng.html

zlib:http://www.zlib.net/

IDE:VS2010

二、编译

将下载的两个zip解压到同一目录下

打开ibpng目录下的projects\vstudio中的工程文件(低版本的VS可以打开projects\visualc71中的工程)。

编译运行,在输出目录(Debug或Realse)中得到输出文件libpng16.dll、libpng16.lib、zlib.lib。

三、创建工程

创建一个工程,右键点击工程名打开Properties(属性)对话框

在C/C++->General(常规)->Additional Include Directories(附加包含目录)中添加libpng目录

在Linker->General(常规)->Additional Library Directories(附加库目录)中添加刚刚生成的lib文件所在的路径

在Linker->Input(输入)->Additional Dependencies(附加依赖项)中添加libpng16.lib、zlib.lib两个文件

四、运行

这里有一个简单的例子,原文:http://zarb.org/~gc/html/libpng.html

/*
 * Copyright 2002-2010 Guillaume Cottenceau.
 *
 * This software may be freely redistributed under the terms
 * of the X11 license.
 *
 */

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#define PNG_DEBUG 3
#include <png.h>

void abort_(const char * s, ...)
{
        va_list args;
        va_start(args, s);
        vfprintf(stderr, s, args);
        fprintf(stderr, "\n");
        va_end(args);
        abort();
}

int x, y;

int width, height;
png_byte color_type;
png_byte bit_depth;

png_structp png_ptr;
png_infop info_ptr;
int number_of_passes;
png_bytep * row_pointers;

void read_png_file(char* file_name)
{
        char header[8];    // 8 is the maximum size that can be checked

        /* open file and test for it being a png */
        FILE *fp = fopen(file_name, "rb");
        if (!fp)
                abort_("[read_png_file] File %s could not be opened for reading", file_name);
        fread(header, 1, 8, fp);
        if (png_sig_cmp(header, 0, 8))
                abort_("[read_png_file] File %s is not recognized as a PNG file", file_name);

        /* initialize stuff */
        png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);

        if (!png_ptr)
                abort_("[read_png_file] png_create_read_struct failed");

        info_ptr = png_create_info_struct(png_ptr);
        if (!info_ptr)
                abort_("[read_png_file] png_create_info_struct failed");

        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[read_png_file] Error during init_io");

        png_init_io(png_ptr, fp);
        png_set_sig_bytes(png_ptr, 8);

        png_read_info(png_ptr, info_ptr);

        width = png_get_image_width(png_ptr, info_ptr);
        height = png_get_image_height(png_ptr, info_ptr);
        color_type = png_get_color_type(png_ptr, info_ptr);
        bit_depth = png_get_bit_depth(png_ptr, info_ptr);

        number_of_passes = png_set_interlace_handling(png_ptr);
        png_read_update_info(png_ptr, info_ptr);

        /* read file */
        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[read_png_file] Error during read_image");

        row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
        for (y=0; y<height; y++)
                row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr));

        png_read_image(png_ptr, row_pointers);

        fclose(fp);
}

void write_png_file(char* file_name)
{
        /* create file */
        FILE *fp = fopen(file_name, "wb");
        if (!fp)
                abort_("[write_png_file] File %s could not be opened for writing", file_name);

        /* initialize stuff */
        png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);

        if (!png_ptr)
                abort_("[write_png_file] png_create_write_struct failed");

        info_ptr = png_create_info_struct(png_ptr);
        if (!info_ptr)
                abort_("[write_png_file] png_create_info_struct failed");

        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[write_png_file] Error during init_io");

        png_init_io(png_ptr, fp);

        /* write header */
        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[write_png_file] Error during writing header");

        png_set_IHDR(png_ptr, info_ptr, width, height,
                     bit_depth, color_type, PNG_INTERLACE_NONE,
                     PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);

        png_write_info(png_ptr, info_ptr);

        /* write bytes */
        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[write_png_file] Error during writing bytes");

        png_write_image(png_ptr, row_pointers);

        /* end write */
        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[write_png_file] Error during end of write");

        png_write_end(png_ptr, NULL);

        /* cleanup heap allocation */
        for (y=0; y<height; y++)
                free(row_pointers[y]);
        free(row_pointers);

        fclose(fp);
}

void process_file(void)
{
        if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB)
                abort_("[process_file] input file is PNG_COLOR_TYPE_RGB but must be PNG_COLOR_TYPE_RGBA "
                       "(lacks the alpha channel)");

        if (png_get_color_type(png_ptr, info_ptr) != PNG_COLOR_TYPE_RGBA)
                abort_("[process_file] color_type of input file must be PNG_COLOR_TYPE_RGBA (%d) (is %d)",
                       PNG_COLOR_TYPE_RGBA, png_get_color_type(png_ptr, info_ptr));

        for (y=0; y<height; y++) {
                png_byte* row = row_pointers[y];
                for (x=0; x<width; x++) {
                        png_byte* ptr = &(row[x*4]);
                        printf("Pixel at position [ %d - %d ] has RGBA values: %d - %d - %d - %d\n",
                               x, y, ptr[0], ptr[1], ptr[2], ptr[3]);

                        /* set red value to 0 and green value to the blue one */
                        ptr[0] = 0;
                        ptr[1] = ptr[2];
                }
        }
}

int main(int argc, char **argv)
{
        if (argc != 3)
                abort_("Usage: program_name <file_in> <file_out>");

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

        return 0;
}

simple example

若编译错误,需要注意:C语言中,变量需要在函数或语句块的开始声明和定义。

若运行时提示缺少libpng16.dll,则将刚刚生成的libpng16.dll文件复制到工程目录(Debug或Realse)中即可。也可以复制到系统目录Windows\System32(64位操作系统需复制到Windows\SysWOW64)中。

若在执行png_read_info(png_ptr, info_ptr)时,出现错误"Unhandled exception at 0x7c928fea in myApp.exe: 0xC0000005: Access violation writing location 0x00000010.",则引用一段话

I solved my problem...
I found someone on LibPNG‘s mailing who had the same problem.
The solution is relatively simple: just be sure that the project in which you are using LibPng is compiled with the same "Runtime Library" settings. I think that by default the lib is compiled in "/MD" (multi-threaded DLL) and a lot of projects are single threaded by default. This setting can be found in the project‘s property under C++/Code Generation (in VC7.1).
So, just insure that the setting are the same for both the library and your project and you should be all set.
This is something that really ought to be mentionned in the documents somewhere (I know that GnuWin32 does not make any documents, but maybe a quick readme with the installer?).
Anyway, thanks!
--Yop83

也就是说,在编译libpng和调用它执行程序时,必须用相同的"Runtime Library"设置。

这里我也碰到了这个问题,是因为编译的时候用的VS2010,创建工程用的VS2008。后来改用为VS2010创建工程,没有问题。

转载请注明出处:
http://www.cnblogs.com/lvrcbl/p/3948641.html

时间: 2024-10-02 18:05:56

libpng安装与配置(Win7+VS2010)的相关文章

CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )

前言 本文讲解如何在VS 2010开发平台中搭建CUDA开发环境 当前配置: 系统:WIN7 64位 开发平台:VS 2010 显卡:英伟达G卡 CUDA版本:6.0 若配置不一样,请勿参阅本文. 第一步 点击这里下载 cuda最新版,目前最高版本是6.0.下载完毕后得到 cuda_6.0.37_winvista_win7_win8.1_general_64.exe 文件. 第二步 运行安装程序,弹出安装过程中转文件路径设定框: 这个路径随便填无所谓,安装完后就会自动删除的,我就直接设置为默认的

JDk安装及配置

·        JDK1.7.0的安装及配置 ·        WIN7  方法/步骤 1. 安装JDK选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目录下,jdk和jre安装在同一文件夹会出错) 如下图所示 2. 1:安装jdk随意选择目录 只需把默认安装目录 \java 之前的目录修改即可 2:安装jre→更改→ \java之前目录和安装 jdk 目录相同

在Win7系统下为VS2010安装和配置OpenCV2.1

由于要重新开发一个机遇OpenCV2.1的程序,因此需要在Win7系统下为VS2010安装和配置OpenCV2.1.网上找了几个教程都不能正确配置,最后找到一篇英文安装的帖子,简单明了实现了配置.为了方便自己日后查看以及其他人的可能的需要,现在将配置过程记录下来. 原帖请见:http://opencv-srf.blogspot.it/2011/09/getting-started-with-opencv_16.html Installing & Configuring OpenCV2.1 wit

win7+vs2010+opencv2.4.6配置

记录一下配置,省的以后还到处去找: (一) 添加环境变量://第一次使用opencv的话需要加环境变量:" %opencv%\build\x86\vc10\bin"和"%opencv%\build\common\tbb\ia32\vc10" 注:%opencv% 用D:\opencv2.4替换:我的opencv是安装在"D:\opencv2.4"目录下的: (二) 配置工程对opencv的依赖: VC++目录\ 1)包含目录D:\opencv2.

Win7+vs2010下安装boost_1_46_1库

一.boost库分类: (1)不需要编译库:any.array.asio.conversion.crc.bind/mem_fn.enable_if.function.lambda.mpl.smart_ptr... (2)需要编译的库:date_time.filesystem.function_types.graph.iostreams.math.mpi.program_options.python.regex.serialization.signals.system.test.thread.wa

Win7 / Win8 搭建配置【vs2010】、【cocos2dx环境】、【Android平台】

[1.安装VS2010] 推荐版本 Microsoft Visual Studio 2010旗舰版(2.5G) http://download.microsoft.com/download/E/0/4/E0427BB8-8490-4C7F-A05B-AFEA0FC3EA80/X16-60997VS2010UltimTrialCHS.iso 注册方法: 方法一:在控制面版的在卸载向导中输入序列号 (不要真的卸载) YCFHQ-9DWCY-DKV88-T2TMH-G7BHP, 方法二:解压ISO后找

Cocos2d-x win7 + vs2010 配置图文详解(亲测)

下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d-1.01-x-0.9.1,具体下载位置如下图: 下载完之后,解压到当前文件夹.我把下载的程序放在F盘根目录,解压完毕之后,双击打开文件夹,看看里面有什么东西,红圈部分就是我们要安装使用的文件: 接下来,我们正式安装cocos2d-x到win7中去. 首先,双击上图中的cocos2d-win32.vc2010.sln(如果你使用的是vs2008,那么只双击co

Win7上Git安装及配置过程

Win7上Git安装及配置过程 文档名称 Win7上Git安装及配置过程 创建时间 2012/8/20 修改时间 2012/8/20 创建人 Baifx 简介(收获) 1.在win7上安装msysgit步骤: 2.在win7上安装TortoiseGit步骤: 3.在VS2010中集成Git方法和步骤. 参考源 Git的配置与使用 http://wenku.baidu.com/view/929d7b4e2e3f5727a5e962a8.html 一.安装说明 1.Git在windows平台上安装说

Win7环境下JDK的安装与配置

初学java,希望自己能够坚持一步一脚印的学习,打好基础,动手操作——致自己 一.了解java的历史及发展 1990年,sun公司预料嵌入式的发展,决定开发一种新的面向对象语言. 1996年,JDK 1.0版本包括:JRE(运行环境) :包括核心API.集成API.用户界面API.发布技术.java虚拟机JVM JDK(开发环境):javac(java程序的编译器) 1997年,JDK 1.1版本.新增JIT(及时编译编译器).传统的编译器是编译一条运行完后将其扔掉,而及时编译会将经常用到的指令