libpngでpng操作がうまくいかない

このQ&Aのポイント
  • Windows環境でpngを扱う方法について
  • libpngとzlibのリソース追加による実行時エラー
  • png操作が正常に動作しない問題への対処方法
回答を見る
  • ベストアンサー

libpngでpng操作がうまくいかない

■環境 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.4

連続投稿、お許し下さい。 No.3でお示ししたリンク先に記述のあった「実行速度」や「データの扱い」から、libpng系を少し試してみたくなったので、ソースを手に入れてコンパイルして。。。と、おもって、 http://www.libpng.org/pub/png/src/libpng-1.2.x-to-1.4.x-summary.txt を見たのですが、 libpngが1.2から1.4へアップした段階で大幅変更がされていることが分かりました。 参照しておられるテストプログラムの環境は非常に古く、当時のlibpngが扱っている関数が大幅変更されているかもしれません。そのため、エラーが発生するのでは?と思われます。

ringist
質問者

お礼

こんばんは。 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

その他の回答 (3)

回答No.3

No.1 & 2です Managed C++関連を検索していて http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_03.html を見つけました。 C++/CLI という系統なのかもしれません。 あと、「PNGプログラミング」で何を選択するか?については、 http://suger-poem.blog.so-net.ne.jp/2008-07-19 http://biboroku.blog16.fc2.com/blog-entry-103.html での記述が参考になるかも知れません。

ringist
質問者

お礼

お疲れ様ですm(__)m その後 zlibのbuildに成功しました そしてソースもうまくエラーなく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.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);    }   }  };

ringist
質問者

お礼

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

関連するQ&A

  • libpng 24bpp rawをPNGに変換する方法

    24bppのrawファイルをPNGファイルに変換するプログラムをlibpngを使って以下の様に記述するのですが runtime errorとなり実行時エラーとなってしまいます。 原因は png_set_IHDR(png_ptr, info_ptr, width, height, // IHDRチャンク情報を設定します 24, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); で24を指定しているところと次のPNG_COLOR_TYPE_RGB,だと掴んでいるつもりなのですが なぜうまくいかないのか分かりません。depthを指定するので24でいいのではないでしょうか? どなたかlibpngをつかっての24bpp RawをPNGに変換する手法をご教授ください int RawToPng(WCHAR *filename,int width,int height) { FILE *fpt_Raw; unsigned char **image; // image[HEIGHT][WIDTH]の形式です int i, j; _wfopen_s(&fpt_Raw,filename,L"rb"); if(fpt_Raw==0x00) { MessageBox(NULL,L"File Open End",L"Error",MB_OK); return -1; } else { #ifdef _DEBUG MessageBox(NULL,L"File Open Success",L"OK",MB_OK); WCHAR DebugStr[256]; wsprintf(DebugStr,L"width=%d,height=%d",width,height); MessageBox(NULL,DebugStr,L"File Error",MB_OK); #endif image = (png_bytepp)malloc(height * sizeof(png_bytep)); // 以下3行は2次元配列を確保します for (j = 0; j < height; j++) { image[j] = (png_bytep)malloc(3*width * sizeof(png_byte)); } //全部読み込む for(i=0;i<height;i++) { fread(&image[i][0],sizeof(unsigned char),3*width,fpt_Raw); } FILE *fpt_output; _wfopen_s(&fpt_output,L"debug.raw",L"wb"); for(i=0;i<height;i++) { fwrite(&image[i][0],sizeof(unsigned char),3*width,fpt_output); } fclose(fpt_output); // PNGファイルを作成します FILE *fp; png_structp png_ptr; png_infop info_ptr; _wfopen_s(&fp,L"RawToPNG.png",L"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チャンク情報を設定します 24, PNG_COLOR_TYPE_RGB, 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); for (j = 0; j < height; j++) { free(image[j]); }// 以下2行は2次元配列を解放します free(image);

  • PNGを24bppBMPに変換したいのですが・・。

    libpngを用いて PNGを24bppBMPに変換したいのですがうまくいきません。 #include "png.h" #pragma comment(lib, "libpng.lib") void PNGtoBMP(char *filename) { FILE *fpt,*fpt_output; png_structp png_ptr; png_infop info_ptr; unsigned long width, height; int bit_depth, color_type, interlace_type; unsigned char **image; int i,j; MessageBox(NULL,"PNG End","PNG End",MB_OK); fopen_s(&fpt,filename, "rb"); if(fpt==NULL) { MessageBox(NULL,"fopen_s error","error",MB_OK); } else { // まずファイルを開きます fopen_s(&fpt_output,"PNG.bmp","wb"); png_structp png_ptr = png_create_read_struct ( PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn); #if 0 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); #endif #if 0 info_ptr = png_create_info_struct(png_ptr); // info_ptr構造体を確保・初期化します png_init_io(png_ptr, fpt); // libpngにfpを知らせます png_read_info(png_ptr, info_ptr); // PNGファイルのヘッダを読み込みます png_get_IHDR(png_ptr, info_ptr, &width, &height, // IHDRチャンク情報を取得します &bit_depth, &color_type, &interlace_type, NULL, NULL); image = (png_bytepp)malloc(height * sizeof(png_bytep)); // 以下3行は2次元配列を確保します for (i = 0; i < height; i++) image[i] = (png_bytep)malloc(png_get_rowbytes(png_ptr, info_ptr)); png_read_image(png_ptr, image); // 画像データを読み込みます int campusline=(int)((width*24+31)/32.0)*4;//メモリ上の1Line(修正値も含む) int modification=campusline-(int)((24/8.0)*width); BITMAPINFOHEADER bmih; BITMAPFILEHEADER bmfh; //RGBQUAD rgbquad; DWORD filesize,bmfhsize,bmihsize; bmfhsize=sizeof(bmfh); bmihsize=sizeof(bmih); //rgbquadsize=sizeof(rgbquad); filesize=bmfhsize+bmihsize+(3*width+modification)*height; ::ZeroMemory(&bmfh, bmfhsize); ::ZeroMemory(&bmih, bmihsize); bmfh.bfType=0x4d42; bmfh.bfSize=filesize; bmfh.bfReserved1=0; bmfh.bfReserved2=0; bmfh.bfOffBits=bmfhsize+bmihsize; bmih.biSize=bmihsize; bmih.biWidth=width; bmih.biHeight=height; bmih.biPlanes=1; bmih.biBitCount=24; bmih.biClrUsed=0; bmih.biCompression=BI_RGB;//無圧縮形式 bmih.biSizeImage=0;//BI_RGBをセットした場合、0が好ましいとMSDNに書いてあった。 bmih.biXPelsPerMeter=0; bmih.biYPelsPerMeter=0; bmih.biClrImportant=0; //ヘッダファイルを書き込む //fwrite(&bmfh,sizeof(unsigned char),bmfhsize,fpt_output); //fwrite(&bmih,sizeof(unsigned char),bmihsize,fpt_output); #if 0 //ここで最終的に書き込みを行う。 for(i=0;i<height;i++) { fwrite(&image[i][0],sizeof(unsigned char),3*width,fpt_output); //修正値の代入 for(j=0;j<modification;j++) { fwrite("\x000",sizeof(unsigned char),1,fpt_output); } } #endif for (i = 0; i < height; i++) free(image[i]); // 以下2行は2次元配列を解放します free(image); png_destroy_read_struct( // 2つの構造体のメモリを解放します &png_ptr, &info_ptr, (png_infopp)NULL); #endif fclose(fpt); fclose(fpt_output); } } *同一ディレクトリに、libpng.lib, libz.lib(zlib.libではない) があります。また、libpng12.dllも要求されたので、同一 ディレクトリに配置しています。 バグは png_structp png_ptr = png_create_read_struct ( PNG_LIBPNG_VER_STRING, (png_voidp) の時点で起きていて これを書いてビルドして実行すると エラーになり open.cででばっかが止まります。 お忙しい中恐縮ですがどなたかご教授お願いします。

  • 画像を読み込んでヒストグラムを作るプログラム

    2値化画像を読み込んで、ヒストグラムを表示させるプログラムを作りたいのですが、 以下のソースを作成したのですが実行中にエラーが発生して困っています。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define width 640 #define height 480 int main(int argc, char* argv[]) { unsigned char image[640*480]; unsigned char header32[1078];//ビットマップ情報 int i; int *histogram; FILE *fp1; unsigned char buffer1[640*480]; for(i=0; i<640*480; i++) { image[i]=0; buffer1[i]=0; } fp1=fopen("koshimizu1.bmp","rb"); // fread(image,1,640*480,fp1); fread(header32,1,1078,fp1); fread(buffer1,width,height,fp1); fclose(fp1); for(i=0;i<256;i++){ histogram[i]=0; } for(i=0;i<640*480;i++){ histogram[image[i]]++; } for(i=0;i<256;i++){ printf("%d %d \n",i,histogram[i]); } return 0; }

  • ppmについて

    縦120横160のppm方式の画像sample01.ppmを改めてout.ppmとして出力するプログラム、 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned char uchar; typedef struct _rgb_ { uchar r, g, b; } RGB; #define WIDTH 160 #define HEIGHT 120 int main(int argc, char **argv) { char s[16]; int i, j; RGB image[HEIGHT][WIDTH]; FILE *fp; fp = fopen("sample01.ppm", "r"); fgets(s, 16, fp); fgets(s, 16, fp); fgets(s, 16, fp); for(j = 0; j < HEIGHT; j++){ for(i = 0; i < WIDTH; i++){ image[j][i].r = (uchar)getc(fp); image[j][i].g = (uchar)getc(fp); image[j][i].b = (uchar)getc(fp); } } fclose(fp); fp = fopen("out.ppm", "w"); fprintf(fp, "P6\n"); fprintf(fp, "%d %d\n", WIDTH, HEIGHT); fprintf(fp, "255\n"); for(j = 0; j < HEIGHT; j++){ for(i = 0; i < WIDTH; i++){ (void)putc(image[j][i].r, fp); (void)putc(image[j][i].g, fp); (void)putc(image[j][i].b, fp); } } fclose(fp); return(EXIT_SUCCESS); } を学校のPCでコンパイルし、実行した時は普通に表示されたのですが、いざ家に持ち帰り、コンパイルし、実行したところ、画像が最初の方で途中できれてしまいます。 学校のコンパイラーはよくわからないのですが、 gcc xx.c のコマンドでコンパイルします。unix 自宅のPCはWINDOWS XPで、コンパイラはborland を使っています 。 bcc32 xx.c とコマンドするやつです。 どうすれば正常に表示されるのでしょうか、助けてください。

  • SDKにてRAW画像(ヘッダ情報0)の表示

    現在RAW画像(ヘッダ情報0)の表示プログラムをSDKにて作成中です。 色々と細かな質問に対してお答えいただいた皆様に感謝します。 おかげで一応表示することができました。 しかし新たな疑問が出てきてしまいました。 詳しく説明します。 まず入力画像情報をグローバルな構造体により管理するため、 typedef struct{ unsigned char *Input_Image; int Width; int Height; HWND hwnd; char szFileName[MAX_PATH]; char szFileTitle[MAX_PATH]; LPBITMAPINFO lpBitmapInfo; HANDLE hMemBitmapInfo; HANDLE hMemInput_Image; int flag; }IMAGEINFORMATION; static IMAGEINFORMATION *Image; このように定義しました。 ちなみにこの構造体メンバの最初のメンバ*Input_Imageは入力画像が格納するポインタです。今回の問題に対しこの*Input_Imageメンバのみ注意をお願いします。 画像入力処理として Image->hMemInput_Image = GlobalAlloc(GHND, sizeof(unsigned char) * Image->Height * Image->Width); Image->Input_Image = (unsigned char *)GlobalLock(Image->hMemInput_Image); により画像情報のポインタをImage->Input_Imageに格納します。 しかし入力した情報をそのまま使用すると、表示した場合に上下さかさまに反転して表示されてしまうので、この後に画像情報の反転処理を行わなければなりません。この反転処理を行う関数をvoid ReverseBitmap(unsigned char *)として、内容を次に示します。 void ReverseBitmap(unsigned char *Input) {   int i, j, width, height;   unsigned char temp;   width = Image->Width-1;   height = Image->Height-1;   for(i=0; i<=height; i++){     for(j=0; j<=width; j++){       temp = Input[width * (height - i) + j];       Input[width * (height - i) + j] = Input[width * i + j];       Input[width * i + j] = temp;     }   } } 関数実行の記述は  ReverseBitmap(Image->Input_Image);  のように行いました。 これにより反転した配列が ReverseBitmap関数の引数に格納されていると考えたのですが、結果は反映されていませんでした。 結果として色々と試してみたのですが、どうやってもさかさまのまま表示されてしまいます。 関数への引数の渡し方、反転の仕方に問題があるようならアドバイスをお願いします。 そして、反転処理を記述した場合、2次元画像を1次元配列で操作するのは結構めんどくさいです。なのでこの上の定義をもとに、反転処理を2次元配列にて行うような方法はないでしょうか? こちらの疑問もよろしくお願いします。

  • プログラム(C)

    #include <stdio.h> #include <stdlib.h> #define FNAME "smp.bmp" #define WSIZE 256 #define HSIZE 256 #define BSIZE 1024 int main(void) { struct BMPFILEHEADER { ・   ・ }; struct BMPINFOHEADER { ・   ・ }; unsigned char img[HSIZE][WSIZE][3]; unsigned char buf[BSIZE]; struct BMPFILEHEADER lpHead; struct BMPINFOHEADER lpInfo; FILE *fp; int i; int j; int k; fp = fopen(FNAME,"rb"); if (fp==NULL) { printf("ファイルをオープンできません\n"); return 0; } fread(&lpHead.bfType, sizeof(unsigned short),1,fp); fread(&lpHead.bfSize, sizeof(unsigned int),1,fp); fread(&lpHead.bfReserved1, sizeof(unsigned short),1,fp); fread(&lpHead.bfReserved2, sizeof(unsigned short),1,fp); fread(&lpHead.bf0ffBits, sizeof(unsigned int),1,fp); fread(&lpInfo, sizeof(struct BMPINFOHEADER),1,fp); for(i=0;i<HSIZE;i++) { fread(buf,sizeof(unsigned char),WSIZE*3,fp); for(j=0;j<WSIZE;j++) { for(k=0;k<3;k++) { img[HSIZE-1-i][j][k]=buf[j*3+k]; } } } fclose; return 0; } このプログラムはBMP画像を読み込むプログラムなんですが このプログラムに画素値を出力するプログラムにしたいのですがうまくできません。 結果は(真っ白な画像の時)255255255・・・255255と出力したいのです。白黒画像なのでR=G=Bで1画素値は255だけでいいのですが。どうしても255255255や25500などとでてしまいます。 アドバイスお願いします。(800字までなので構造体の宣言は抜いてしましました) 。

  • c言語でソーベルフィルタが作りたい

    c言語で画像処理のソーベルのフィルタが作りたいのですが、どうにもうまく動きません。おかしい点をご指摘していただけないでしょうか。一次元配列で作りたいです。 /*wiは読み込んだ画素値、woは書き出す画素値、m1,m2はフィルタ係数、widthは画像の幅、heightは画像の高さ*/ void sobel(unsigned char wi[], unsigned char wo[], char m1[],char m2[],int width, int height){ int i,j,k,l,z; unsigned char *w; unsigned char *wo2; w = (char*)malloc(sizeof(char)*(MW*MH)); wo2 = (char*)malloc(sizeof(char)*(MW*MH)); /*フィルタの適用*/ for(i=width+1; i<width*height; i++) wo[i]=wi[i-1-width]*m1[0]+wi[i-width]*m1[1]+wi[i+1-width]*m1[2]+wi[i-1]*m1[3]+wi[i]*m1[4]+wi[i+1]*m1[5]+wi[i-1+width]*m1[6]+wi[i+width]*m1[7]+wi[i+1+width]*m1[8]; for(j=width+1; j<width*height; j++) wo2[j]=wi[j-1-width]*m2[0]+wi[j-width]*m2[1]+wi[j+1-width]*m2[2]+wi[j-1]*m2[3]+wi[j]*m2[4]+wi[j+1]*m2[5]+wi[j-1+width]*m2[6]+wi[j+width]*m2[7]+wi[j+1+width]*m2[8]; for(k=width+1; k<width*height; k++) wo[k] = (unsigned char)sqrt(wo[k]*wo[k]+wo2[k]*wo2[k]); /*画素値を0から255に*/ for(l=width+1; l<width*height; l++){ if((unsigned char)wo[l] < 0) w[l] = 0; else if((unsigned char)wo[l] > 255) w[l] = 255; else w[l] = wo[l]; } for(z=width+1; z<width*height; z++) wo[z] = w[z]; free(w); free(wo2); } よろしくお願いしますm(_ _)m

  • RGBをCMYKに変換するプログラム

    Windows7 VS2008 SP1 RGBからCMYKに変換するプログラムを以下の様に書いている ([詳解]画像処理プログラミング という本に載っている ソースです) のですがうまくいきません。 おそらく型の扱い??だと思うのですが・・ 具体的にどの部分を修正すればいいのかご指摘お願いします。 INPUT:24bpp raw int RawToCMYK(WCHAR *filename,int width,int height) { FILE *fpt; FILE *fpt_C,*fpt_M,*fpt_Y,*fpt_K; unsigned char *layer; unsigned char *C,*M,*Y,*K; int i,j; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"RawToCMYK Error",L"RawToCMYK Error",MB_OK); return -1; } else { layer=(unsigned char*)malloc(3*width*height); C=(unsigned char *)malloc(width*height); M=(unsigned char *)malloc(width*height); Y=(unsigned char *)malloc(width*height); K=(unsigned char *)malloc(width*height); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); fclose(fpt); _wfopen_s(&fpt_C,L"RawToC.raw",L"wb"); _wfopen_s(&fpt_M,L"RawToM.raw",L"wb"); _wfopen_s(&fpt_Y,L"RawToY.raw",L"wb"); _wfopen_s(&fpt_K,L"RawToK.raw",L"wb"); for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { C[i/3+j/3]=255-layer[i+j]; M[i/3+j/3]=255-layer[i+j+1]; Y[i/3+j/3]=255-layer[i+j+2]; K[i/3+j/3]=min3(C[i/3+j/3],M[i/3+j/3],Y[i/3+j/3]); if(K[i/3+j/3]==0xff) { C[i/3+j/3]=0x00; M[i/3+j/3]=0x00; Y[i/3+j/3]=0x00; } else { C[i/3+j/3]=(C[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); M[i/3+j/3]=(M[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); Y[i/3+j/3]=(Y[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); } } } fwrite(&C[0],sizeof(unsigned char),width*height,fpt_C); fwrite(&M[0],sizeof(unsigned char),width*height,fpt_M); fwrite(&Y[0],sizeof(unsigned char),width*height,fpt_Y); fwrite(&K[0],sizeof(unsigned char),width*height,fpt_K); fclose(fpt_C); fclose(fpt_M); fclose(fpt_Y); fclose(fpt_K); free(C); free(M); free(Y); free(K); return 0;

  • 3次元配列でのポインタ

    唐突ですみません。 サイズが640*480の画像を180枚読み込むプログラムをポインタを使って作成しようと考えています。 以下で示すプログラムは画像を読み込むための作成したものですが、エラーが出てしまい実行することができません。 間違えている箇所があればご指摘お願いします。 また、そのほかに効率の良いやり方などがありましたらご教授願います。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define xsize 640 #define ysize 480 #define round 180 #include "Input.h" void Input_task(unsigned char ***In); void main() {   static unsigned char ***In;   int i,j;   In=(unsigned char***)malloc(sizeof(unsigned char)*round);   for(i=0;i<round;i++)   {     In[i]=(unsigned char**)malloc(sizeof(unsigned char)*ysize);     for(j=0;j<ysize;j++)     {       In[i][j]=(unsigned char*)malloc(sizeof(unsigned char)*xsize);     }   }   Input_task(In); } Input.hの中身 void Input_task(unsigned char ***In) {   char filename[30];   int i,j,k;   FILE *fp;   for(i=0;i<round;i++)   {     sprintf(filename,"b20_%04d.raw",i);     fp=fopen(filename,"rb");    for(j=0;j<ysize;j++)     {       for(k=0;k<xsize;k++)       {         *(*(*(In+i)+j)+k)=(unsigned char)getc(fp);       }     }    fclose(fp);   } }

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }