Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://yahirohumpty.blog2.fc2.com/tb.php/280-8640d45a

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

libpng on win32

libpngをつかいたくなったのでごにょごにょしてました.

基礎知識:
libpngはzlibを使う.
本家サイトはそれぞれ
http://www.libpng.org/pub/png/libpng.html
http://www.zlib.net/

参考としたサイト:
http://www.kcrt.net/program/uselibpng_read.html
http://d.hatena.ne.jp/kurai/20070411/1176275091

ビルドの仕方 on VC
まず適当なディレクトリにlibpngとzlibのソースを持ってきて展開.
このとき,zlibのほうはzlibというディレクトリ名にしておく.
libpng側のプロジェクトファイルでzlibのビルドもしてくれることになる.
projects/visualc71/libpng.slnがそれ.
普通にビルドは通った.

利用の仕方
作ったlibpng**.dllとzlib**.dllがパスに入っていること.
libpng**.libをコンパイル時に読み込ませること.
png.h,pngconf.h,zlib.h,zconf.hがパスに入っていること.


問題はコーディング.手順を間違うと
なんだかよくわからないランタイムエラーで落ちてくれるので注意.
公式のリファレンスは
http://www.libpng.org/pub/png/libpng-1.2.5-manual.html
だけどちょっとわかりづらい.ので
http://www.kcrt.net/program/uselibpng_read.html
いったんこちらのサイトのコードを参考にさせていただいた.

以下,簡単なフォーマットをダンプするだけのコードです.
*すいませんエスケープ忘れ修正しました


#include <stdio.h>
#include "png.h"
#pragma comment(lib,"libpng13d.lib")
#pragma comment(lib,"zlib1d.lib")

void pngreadfunction(png_struct *png,png_bytep buf,png_size_t size){
unsigned char** p = (unsigned char**)png_get_io_ptr(png);
memcpy(buf, *p, size);
*p += (int)size;
}

int main(){
FILE *fp;
int fsize;
unsigned char *filebuf;

png_struct *png;
png_info *pnginfo;
unsigned int width,height;
int bdepth,ctype;

fp=fopen("Yukkuri.png","rb");
if(!fp){
fprintf(stderr,"File not found: %s\n","Yukkuri.png");
return 0;
}
fseek(fp,0,SEEK_END);
fsize=ftell(fp);
fseek(fp,0,SEEK_SET);

filebuf=(unsigned char *)malloc(fsize);

fread(filebuf,fsize,1,fp);

if(!png_check_sig(filebuf,fsize)){
fprintf(stderr,"File is not PNG: %s\n","Yukkuri.png");
fclose(fp);
return 0;
}

png=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL);
if(!png){
fprintf(stderr,"cannot create PNG struct: %s\n","Yukkuri.png");
fclose(fp);
return 0;
}
pnginfo=png_create_info_struct(png);
if(!pnginfo){
fprintf(stderr,"cannot create PNG info: %s\n","Yukkuri.png");
png_destroy_read_struct(&png,NULL,NULL);
fclose(fp);
return 0;
}

png_set_read_fn(png,(png_voidp)&filebuf,(png_rw_ptr)pngreadfunction);

png_read_info(png,pnginfo);
png_get_IHDR(png,pnginfo,&width,&height,&bdepth,&ctype,NULL,NULL,NULL);
printf("width = %d , height = %d\n",width,height);
printf("bit depth = %d , color type = %d\n",bdepth,ctype);

png_destroy_read_struct(&png,&pnginfo,NULL);
free(filebuf);
fclose(fp);

return 0;
}


ちなみにYukkuri.pngは
http://riceballman.fc2web.com/AA-Illust/Data/Yukkuri.html
をおかりしました.

気をつけるべきは,途中のpng_get_IHDRの前にpng_set_read_fnがされてないと
ランタイムエラーで落ちる.デバッグしにくくて大変でした.


スポンサーサイト
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://yahirohumpty.blog2.fc2.com/tb.php/280-8640d45a

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

yahirohumpty

  • Author:yahirohumpty
  • 某大学の研究員です.
    博士号持ってます.
    ビジョンとロボットが専門.
    その他もろもろのことに興味があります.

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。