■環境
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;
}
No.1
- 回答日時:
どのような作業を想定しておられるのか分かりませんが、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);
}
}
};
アドバイスありがとうございます
C#ですかね。そういった関数があるのは
知りませんでした。かなり便利ですね!情報
ありがとうございます
私がやろうとしているのは、あくまでlibpng.libを使っての
pngの読み込み書き込みなのです。
No.2
- 回答日時:
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/
No.3
- 回答日時:
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
での記述が参考になるかも知れません。
お疲れ様ですm(__)m
その後
zlibのbuildに成功しました
そしてソースもうまくエラーなくpngを生成できました
かなり複雑でした・・・・・・・・・・・
今までで一番つらかった・・かも。・。
アドバイス本当にありがとうございました!!
No.4ベストアンサー
- 回答日時:
連続投稿、お許し下さい。
No.3でお示ししたリンク先に記述のあった「実行速度」や「データの扱い」から、libpng系を少し試してみたくなったので、ソースを手に入れてコンパイルして。。。と、おもって、
http://www.libpng.org/pub/png/src/libpng-1.2.x-t …
を見たのですが、
libpngが1.2から1.4へアップした段階で大幅変更がされていることが分かりました。
参照しておられるテストプログラムの環境は非常に古く、当時のlibpngが扱っている関数が大幅変更されているかもしれません。そのため、エラーが発生するのでは?と思われます。
こんばんは。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの「MsgBox」について
-
画像リストを作りたい
-
BLOBデーターの画像の表示方法...
-
pictureboxに表示した画像のフ...
-
「imagejpeg」(GD)で作成した...
-
透過PNGが透過されない!!
-
画像が存在しない時の 「×」 表...
-
PythonのTkinter詳しい方へ。画...
-
php,mysqlにて画像パス保存/表...
-
PHPで吐き出した画像にリンクを...
-
VBAについて教えてください
-
ImageTTFTextで保存すると文字...
-
例えば、掲示板(bbs)モジュール...
-
画像読み込みとランダム表示に...
-
PHP MySQLに画像を直接保存
-
ListViewコントロールでサムネ...
-
ビットマップ画像を読み込むプ...
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの「MsgBox」について
-
拡張子php画像をjpg画像等に変...
-
透過PNGが透過されない!!
-
アップロード画像数でCSSを分け...
-
imageフォルダに、画像をリサイ...
-
VBAでJPGサイズ変更
-
Illustratorで文字と画像を流し...
-
VBAのコードを教えてください
-
C# Excelファイルへの画像挿入。
-
php,mysqlにて画像パス保存/表...
-
GDI+を使ったビット数とDPIの扱い
-
SQLiteに画像を格納したい
-
ListViewコントロールでサムネ...
-
★PHP?★画像を縦横比を変えずに...
-
ビットマップ画像を読み込むプ...
-
phpで画像がどうしても文字化け...
-
PHPで吐き出した画像にリンクを...
-
phpMyAdminに画像を保存できない
-
OpenGLで描いて画像ファイル出力
-
手作業で埋め込んだ、UserForm1...
おすすめ情報