アプリ版:「スタンプのみでお礼する」機能のリリースについて

■環境
Windows 7
VS2008

以下をみて
http://gmoon.jp/png/#whats

下記のソースを書いたのですが
実行時エラーになります。。。
libpngとzlibは
リソースに追加しています。
ほかにもlibpng12.dllを追加しています。
ほしい情報は、windows環境でpngを扱う方法です。

#include "stdafx.h"


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

#define WIDTH (256)
#define HEIGHT (128)

void write_png(char *file_name, unsigned char **image);
int main()
{
unsigned char **image; // image[HEIGHT][WIDTH]の形式です
int i, j;

image = (png_bytepp)malloc(HEIGHT * sizeof(png_bytep)); // 以下3行は2次元配列を確保します
for (j = 0; j < HEIGHT; j++)
image[j] = (png_bytep)malloc(WIDTH * sizeof(png_byte));
for (i = 0; i < WIDTH; i++) { // 以下5行は単純なテストパターンを作ります
for (j = 0; j < HEIGHT; j++) {
image[j][i] = (unsigned char)i;
}
}
write_png("test.png", image); // PNGファイルを作成します
for (j = 0; j < HEIGHT; j++) free(image[j]); // 以下2行は2次元配列を解放します
free(image);
return 0;
}

void write_png(char *file_name, unsigned char **image)
{
FILE *fp;
png_structp png_ptr;
png_infop info_ptr;

fp = fopen(file_name, "wb"); // まずファイルを開きます
png_ptr = png_create_write_struct( // png_ptr構造体を確保・初期化します
PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info_ptr = png_create_info_struct(png_ptr); // info_ptr構造体を確保・初期化します
png_init_io(png_ptr, fp); // libpngにfpを知らせます
png_set_IHDR(png_ptr, info_ptr, WIDTH, HEIGHT, // IHDRチャンク情報を設定します
8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_write_info(png_ptr, info_ptr); // PNGファイルのヘッダを書き込みます
png_write_image(png_ptr, image); // 画像データを書き込みます
png_write_end(png_ptr, info_ptr); // 残りの情報を書き込みます
png_destroy_write_struct(&png_ptr, &info_ptr); // 2つの構造体のメモリを解放します
fclose(fp); // ファイルを閉じます
return;
}

A 回答 (4件)

どのような作業を想定しておられるのか分かりませんが、VS2008であれば、たとえば、windowsフォームのアプリケーションを作成し、pictureBoxと、saveFileDialogと、buttonを埋め込み、buttonをクリックすると、ファイルダイアログを開いてpictureBoxに書き込まれている画像をpng形式で保存することが、簡単にできてしまいます。



===以下は、buttonをクリックしたときにpng形式で保存するようにしている部分です。(テストには、pictureBoxのImageプロパティに、適当なjpegファイルを指定して実行しました。プログラム内部で画像を作ったり、操作してpng形式で保存することも可能なはずです)

 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
  this->saveFileDialog1->ShowDialog();
   if (!System::String::IsNullOrEmpty(this->saveFileDialog1->FileName)) {
    this->pictureBox1->Image->Save(this->saveFileDialog1->FileName,System::Drawing::Imaging::ImageFormat::Png);
   }
  }
 };
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます
C#ですかね。そういった関数があるのは
知りませんでした。かなり便利ですね!情報
ありがとうございます
私がやろうとしているのは、あくまでlibpng.libを使っての
pngの読み込み書き込みなのです。

お礼日時:2010/01/31 18:09

No.1です。


C#ではないのですが。。。

実のところ、openGL関係のソフトを作らねばならなくなったので、久々にC++をいじっていたのですが、私の扱っていたものは、どうやらmanaged C++というものらしいですね。
No.1のソースは、visual C++ 2008 Express editionで、「windowsフォーム」を選択して、フォームにボタンを貼り付け、クリックなどのイベントに対する処理ルーチンの雛形(関数)の中身に、5行書き加えただけのものだったのですが、
//>>>
 System::Object^ sender, System::EventArgs^ e
//<<<
という表現には、正直面食らいました。
//>>>
 ^
//<<<
って、xor演算子?と思っていたら、なんと「(機能が制限された)ポインタ」といった意味らしいです。

なんでも、.net framewarkに対応する中間コードを吐き出させて、VBやVC#と共通のランタイムを利用可能にするためのソース形式らしいです。

windowsに限定し、pngをVC++で扱うということならば、ということで、前回の回答をさせていただきましたが、「libpng.libを利用した」ということですので、お力になれず、残念です。

参考URL
http://blog.windy.ac/managed_c/
「libpngでpng操作がうまくいかない」の回答画像2
    • good
    • 0

No.1 & 2です



Managed C++関連を検索していて
http://www.atmarkit.co.jp/fdotnet/special/cppcli …
を見つけました。
C++/CLI
という系統なのかもしれません。

あと、「PNGプログラミング」で何を選択するか?については、
http://suger-poem.blog.so-net.ne.jp/2008-07-19
http://biboroku.blog16.fc2.com/blog-entry-103.html
での記述が参考になるかも知れません。
    • good
    • 0
この回答へのお礼

お疲れ様ですm(__)m
その後
zlibのbuildに成功しました
そしてソースもうまくエラーなくpngを生成できました

かなり複雑でした・・・・・・・・・・・
今までで一番つらかった・・かも。・。

アドバイス本当にありがとうございました!!

お礼日時:2010/02/03 22:04

連続投稿、お許し下さい。



No.3でお示ししたリンク先に記述のあった「実行速度」や「データの扱い」から、libpng系を少し試してみたくなったので、ソースを手に入れてコンパイルして。。。と、おもって、
http://www.libpng.org/pub/png/src/libpng-1.2.x-t …
を見たのですが、
libpngが1.2から1.4へアップした段階で大幅変更がされていることが分かりました。

参照しておられるテストプログラムの環境は非常に古く、当時のlibpngが扱っている関数が大幅変更されているかもしれません。そのため、エラーが発生するのでは?と思われます。
    • good
    • 0
この回答へのお礼

こんばんは。


libpngのバージョンが古い点を追求してくださりありがとうございます。


http://www.libpng.org/pub/png/libpng.htmlでバイナリを入手し
buildして1.4.0のlibpngはビルドできました
(なぜかbuildのときにzlib.h,zconf.h,zlib.libが必要だった)

しかし それを使って最初の質問のソースを実行すると以下の書き込みでエラーがでます。

#if 0
png_write_info(png_ptr, info_ptr); // PNGファイルのヘッダを書き込みます
png_write_image(png_ptr, image); // 画像データを書き込みます
png_write_end(png_ptr, info_ptr); // 残りの情報を書き込みます
png_destroy_write_struct(&png_ptr, &info_ptr); // 2つの構造体のメモリを解放します
fclose(fp); // ファイルを閉じます
#endif

そこで今度はzlib.libが古いんだろうとおもってbuildしようとしているのですが
うまくいきません。
zlib123\win32のVisualC.txtをみると
To build zlib using the Microsoft Visual C++ environment,
use the appropriate project from the projects/ directory.
とあります。
そこでzlib.dswをまずVS2008を使っているのでslnに変換をして
そのあとにzlibをbuild(rebuild)すると以下のエラーが出てビルドが通りません。

error A2070:invalid instruction operands

お礼日時:2010/02/03 21:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!