1bppファイルを8bpp(raw)に変換する方法

このQ&Aのポイント
  • Windows7とVS2008 SP1の環境で1bppの画像を8bppに変換しようとしていますが、うまくいきません。アドバイスをお願いします。
  • int Main1bppTo8bpp関数を使用して1bppファイルを8bppに変換する方法を教えてください。
  • 変換した画像を1bppTo8bpp.rawとして保存する方法についても教えてください。
回答を見る
  • ベストアンサー

1bppファイルを8bpp(raw)に変換する。

環境 Windows7 VS2008 SP1 1bppの画像を8bppに変換しようとしているのですが うまくいきません。自分ではこれで 合っていると思うのですが・・・ 何かアドバイスお願いしますm(__)m int Main1bppTo8bpp(WCHAR *filename,int width,int height) { //width,heightは8bppになったときの幅,高さを指定する。 FILE *fpt; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK); return -1; } else { unsigned char *layer,*Output; layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char)); Output=(unsigned char*)malloc(width*height); //読み込み fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt); FILE *fpt_output; _wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb"); int i,j,flag=0x00; for(i=0;i<((width/8)+1)*height;i+=((width/8)+1)) { for(j=0;j<((width/8)+1);j++) { //8bit目 if((layer[i+j]&BIT8)==BIT8) { Output[i+j+flag]=0x00; } else { Output[i+j+flag]=0xff; } //7bit目 if((layer[i+j]&BIT7)==BIT7) { Output[i+j+flag+1]=0x00; } else { Output[i+j+flag+1]=0xff; } //6bit目 if((layer[i+j]&BIT6)==BIT6) { Output[i+j+flag+2]=0x00; } else { Output[i+j+flag+2]=0xff; } //5bit目 if((layer[i+j]&BIT5)==BIT5) { Output[i+j+flag+3]=0x00; } else { Output[i+j+flag+3]=0xff; } //4bit目 if((layer[i+j]&BIT4)==BIT4) { Output[i+j+flag+4]=0x00; } else { Output[i+j+flag+4]=0xff; } //3bit目 if((layer[i+j]&BIT3)==BIT3) { Output[i+j+flag+5]=0x00; } else { Output[i+j+flag+5]=0xff; } //2bit目 if((layer[i+j]&BIT2)==BIT2) { Output[i+j+flag+6]=0x00; } else { Output[i+j+flag+6]=0xff; } //1bit目 if((layer[i+j]&BIT1)==BIT1) { Output[i+j+flag+7]=0x00; } else { Output[i+j+flag+7]=0xff; } flag=flag+8; } flag=0x00; } //最終的な「fwrite」はここでする。 fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output); free(layer); free(Output); fclose(fpt); fclose(fpt_output); } return 0;

質問者が選んだベストアンサー

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

#1 補足 多分1ライン分だけでもおかしくなります(1バイト分しかポインタが合わない) > これ要らなくないですか? を消した場合 >Output[i+j+flag+7]=0xff; と同等代入文の i+j+ の部分も邪魔になるかと Output の添え字部分の計算をちゃんと治したほうがいいような気はします (i+j)*8+flag  かな(半ば意識飛んでる状態で書いてるのでちゃんと確認してください)

ringist
質問者

お礼

こんばんは! アドバイスありがとうございました! 無事解決できましたm(___)m

その他の回答 (1)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

確認したわけではないので間違ってるかもですが これだと最初の一ライン分の出力バッファオフセットに問題なくても 2行目以後でオフセットの計算が違いませんか? flag=flag+8; } flag=0x00;  --- これ要らなくないですか? }

関連するQ&A

  • RGB→YUV変換のプログラム

    RGB→YUV変換を行っているのですが、 うまくいきません。 以下であっているのでしょうか? //RGB > YUV変換 void RGBtoYUV(char *filename,int width,int height) { FILE *fpt,*fpt_output; unsigned char *Input,*head; unsigned char Y=0,U=0,V=0; int i,j,b_flag=1; int modification=0; modification=width%4; //ファイルのオープン fopen_s(&fpt,filename,"rb"); if(fpt==NULL) { char DebugStr[256]; wsprintf(DebugStr,"%sが存在しません",filename); MessageBox(NULL,DebugStr,"File Error",MB_OK); } else { fopen_s(&fpt_output,"YUV.bmp","wb"); //ヘッダ情報の書き込み head=(unsigned char*)malloc(54); fread(head,sizeof(unsigned char),54,fpt); fwrite(head,sizeof(unsigned char),54,fpt_output); free(head); Input=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //メモリに展開 for(i=0;i<height;i++) { fread(&Input[i*(3*width)],sizeof(unsigned char),3*width,fpt); fseek(fpt,modification,SEEK_CUR); } fclose(fpt);//Inputファイルのクローズ for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { Y=(unsigned char)(0.299*Input[i+j+2]+0.587*Input[i+j+1]+0.114*Input[i+j]); U=(unsigned char)(-0.169*Input[i+j+2]-0.3316*Input[i+j+1]+0.500*Input[i+j]); V=(unsigned char)(0.500*Input[i+j+2]-0.4186*Input[i+j+1]-0.0813*Input[i+j]); //Y if(Y<0) { Input[i+j]=0x00; } else if(Y>255) { Input[i+j]=0xff; } else { Input[i+j]=Y; } //U if(U<0) { Input[i+j+1]=0x00; } else if(U>255) { Input[i+j+1]=0xff; } else { Input[i+j+1]=U; } //V if(V<0) { Input[i+j+2]=0x00; } else if(V>255) { Input[i+j+2]=0xff; } else { Input[i+j+2]=V; } } }//i fseek(fpt_output,54,SEEK_SET); for(i=0;i<height;i++) { fwrite(&Input[3*width*i],sizeof(unsigned char),3*width,fpt_output); //修正値の代入 for(j=0;j<modification;j++) { fwrite("\x000",sizeof(unsigned char),1,fpt_output); } } fclose(fpt_output); free(Input); } } 又 YUV→RGBにすると元の画像に戻らずに困っています。 プログラムに対するご指摘お願いします。 このプログラムはWindowGUIで幅と高さとファイル名を入力して 走らせるプログラムです。24bpp BMPが対象です。

  • 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;

  • C言語による間引き拡大縮小

    http://csharpimage.blog60.fc2.com/blog-entry-18.html をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、 rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。 24bppのRawファイル(RGB)を拡大縮小しようとしています。 rescale[i+j] =layer[(int)xpos+(int)ypos];の layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。 layer:24bppRawを読み込むメモリ アドバイスお願い致します。m(___)m FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale; int hySize=Common_Data_Raw->height_rescale; // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)xSize / hxSize; double hokanY = (double)ySize / hySize; unsigned char *layer,*rescale; //読み込み layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); //拡大縮小後のサイズ rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char)); ypos = 0.0; for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize) { xpos = 0.0; for (int j=0;j<3*hxSize;j+=3) { // 単純補間・間引き rescale[i+j] =layer[(int)xpos+(int)ypos]; rescale[i+j+1]=layer[(int)xpos, (int)ypos]; rescale[i+j+2]=layer[(int)xpos, (int)ypos]; xpos += hokanX; } ypos += hokanY; } _wfopen_s(&fpt_output,L"output.raw",L"wb"); fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(rescale); return 0;

  • 16bppBMPの仕様について

    環境 Windows7 VS2008 SP1 windows BMP の「16bpp」の仕様について質問です。 ​http://www5d.biglobe.ne.jp/~noocyte/Programming/Windows/BmpFileForm...​ によれば 16 最大 216 色.ビットマップデータの各 WORD が1画素を表す. と書かれているのですが、 これが本当だとして BGRは(B,G,R)=(5bit,5bit,5bit)で構成すればよいのでしょうか? 1bitはあまりです。 結果としては、 Windowsフォトビュワーやmspaintで 正常にみれればよいと考えています また、16bppの仕様がいまいちよくわかりません。 1)mspaintで24bppの画像を16bppで保存したもの 2)自分のプログラムで生成した16bpp画像 を比較すると、「ヘッダ部分」は全て合っているのですが、 「画像データ部分」が全く異なっています。 私は1lineが BGR(2byte)+BGR(2byte)+・・・・・・+修正値(4byteバウンダリ) だと思っているのですが 違うのでしょうか? ちなみに5bit 5bit 5bitをつめこむプログラムは以下です int i,j; int x=0,y=0; for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { Output[x+y]=((layer[i+j])|(layer[i+j+1]>>SHIFT_R_5)); Output[x+y+1]=(((layer[i+j+1]>>SHIFT_R_3)<<SHIFT_L_6))|(((layer[i+j+2]>>SHIFT_R_3)<<SHIFT_L_1)); y+=2; } x+=2*width; y=0; } 間違っていたらご指摘お願いします。 以上 よろしくおねがいします

  • 放射状ブラー C言語で書いたのですが結果がうまくいっていない

    こんばんは! Windows環境,VS2005で放射状ブラーを以下の様に書きましたが、 結果が添付ファイルの様になってしまい、うまくいきません。 コンパイルは通り実行もできるのですが、結果がうまくいっていないのです。(いろんな画像で試しましたが明らかに うまくいっていない気がするのです) 参考にしたのは、 http://www.sbcr.jp/books/download/art.asp?newsid=2198 の " 第3章 エフェクト処理の応用(その1) IPP_Chap3a.zipの中にある list3_14.cです。 又、web上では、http://d.hatena.ne.jp/matsu4512/20090726/1248575190 参考にしました。 以下が私が書いたものです。Input=24bppのrawファイル名 幅、高さが入った構造体です。 プログラミング思想としては、1次元配列で画像を表しています。 #define NN 17 #define NF 8 int Main24bppToRadialBlur(COMMONDATA *Common_Data_Raw) { FILE *fpt; FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; int i; unsigned char *layer,*img_output; int rr,gg,bb,oo; int x1=0; int y1=0; int x2=3*width-3; int y2=3*width*height-3*width; WCHAR DebugStr[256]; double ox,oy; ox=(double)(x2-x1)/2.0; oy=(double)(y2-y1)/2.0; double dx,dy; dx=(double)x2-ox; dy=(double)y2-oy; double disMAX; disMAX=sqrt(dx*dx+dy*dy); int x,y; int xx,yy; double rate,rad=0,dis,disI; int pat_sum,pat; double ef=30.0; _wfopen_s(&fpt,Common_Data_Raw->filename,L"rb"); layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //読み込み fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); img_output=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //◆画像処理をするスペース for(y=y1;y<=3*width*height-3*width;y+=3*width) { for(x=x1;x<=3*width-3;x+=3) { rr=gg=bb=oo=0; dx=(double)x-ox; dy=(double)y-oy; if(dx!=0.0) { rad=atan(dy/dx); } else { rad=3.14159265/2.0; } //rad+=(3.14159265/2.0); dis=sqrt(dx*dx+dy*dy); rate=ef*dis/disMAX; rate/=((double)NF); pat_sum=0; for(i=0;i<NN;i++) { if(i==NF) { pat=3; } else { pat=1; } disI=(double)(i-NF)*rate; xx=(int)(disI*cos(rad))+x; yy=(int)(disI*sin(rad))+y; rr+=layer[xx+yy] * pat; gg+=layer[xx+yy+1]* pat; bb+=layer[xx+yy+2]* pat; oo+= pat; pat_sum+=pat; } img_output[x+y]=rr/(oo); img_output[x+y+1]=gg/(oo); img_output[x+y+2]=bb/(oo); }//x }//y _wfopen_s(&fpt_output,L"RGBToRadialBlur.raw",L"wb"); fwrite(&img_output[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(img_output);

  • 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ででばっかが止まります。 お忙しい中恐縮ですがどなたかご教授お願いします。

  • http://csharpimage.blog60.fc2.com/b

    http://csharpimage.blog60.fc2.com/blog-entry-19.html をみて、直線補間をC言語で記述したのですが、結果が思う様にいきません。(_____) プログラムは以下です。間違っているのは、おそらく、座標を示すところだとはおもっているのですが、 そこをどうすればいいのか。。。。レベルが低くてごめんなさい(>_< どなたかご教授願います。 FILE *fpt; _wfopen_s(&fpt,Common_Data_Raw->filename,L"rb"); FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale;//拡大、縮小後の幅が入っている int hySize=Common_Data_Raw->height_rescale;//拡大、縮小後の高さが入っている。 // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)(xSize - 1) / hxSize; double hokanY = (double)(ySize - 1) / hySize; int i,j; unsigned char **layer,**bufdata,**rescale; //メモリの確保→省略します。 if ((xSize < hxSize)&&(ySize<hySize)) { // X方向の補間 for (i=0;i<ySize;i++) { xpos = 0.0; for (j = 0; j < hxSize; j+=3) { bufdata[i][j] = (unsigned char)(((double)layer[i][(int)xpos + 1] - (double)layer[i][(int)xpos]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos]); bufdata[i][j+1] = (unsigned char)(((double)layer[i][(int)xpos + 1+1] - (double)layer[i][(int)xpos+1]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+1]); bufdata[i][j+2] = (unsigned char)(((double)layer[i][(int)xpos + 1+2] - (double)layer[i][(int)xpos+2]) *(xpos - (int)xpos) +(double)layer[i][(int)xpos+2]); xpos += hokanX;} } // Y方向の補間 for (i = 0; i < hxSize; i+=3) {ypos = 0.0;for (j = 0; j <hySize; j++) {rescale[j][i] = (unsigned char)(((double)bufdata[(int)ypos + 1][i] - (double)bufdata[(int)ypos][i]) *(ypos - (int)ypos) + (double)bufdata[(int)ypos][i]);rescale[j][i+1] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+1] - (double)bufdata[(int)ypos][i+1]) *(ypos - (int)ypos) + (double)bufdata[(int)ypos][i+1]); rescale[j][i+2] = (unsigned char)(((double)bufdata[(int)ypos + 1][i+2] - (double)bufdata[(int)ypos][i+2]) * (ypos - (int)ypos) + (double)bufdata[(int)ypos][i+2]); ypos += hokanY;}} } else { //rescaledata = SimpleRescaleImage(data, hxSize, hySize);

  • コード変換について

    このようなS-JISからEUCにコードを変換する関数のサンプルで見つけたのですが。これを実装するにはどうすればいいのかわかりません。 unsigned int sjis2euc(unsigned int sjis) {   unsigned int hib, lob;   hib = (sjis >> 8) & 0xff;   lob = sjis & 0xff;   hib -= (hib <= 0x9f) ? 0x71 : 0xb1;   hib = (hib << 1) + 1;   if (lob >= 0x9e) {     lob -= 0x7e;     hib++;     } else if (lob > 0x7f) lob -= 0x20;   else lob -= 0x1f;   hib |= 0x80;   lob |= 0x80;   return (hib << 8) | lob; } たとえば char *str[] = "あいうえお" などとなっているにはどうやってこの関数を活用すればいいのでしょうか。

  • 共用体のアドレスを取得したい

    SH7047のプログラムです。 何をしたいのかと言うと、P_PORTD.PDDRL.BIT.PD4DR等を関数の中で変化させたいのです。 うまく行かない理由はおそらく「P_PORTD.PDDRL.BIT.PD4DRのアドレスは渡すことが出来ない」だとおもいます。 まぁそれも当然な話だと思うのですが、どうにかならないでしょうか? 個人的には「unsigned short* port」→「bit* port」の様に出来れば理想的なのですが。 何か良い方法を教えてください。よろしくお願いします。 #define P_PORTD (*(volatile struct st_portd *)0xFFFF83A2)/* PORTD Address */ struct st_portd { /* struct PORTD */ union { /* PDDRL */ unsigned short WORD; /* Word Access */ struct { /* Bit Access */ unsigned short :7; /* */ unsigned short PD8DR:1; /* PD8DR */ unsigned short PD7DR:1; /* PD7DR */ unsigned short PD6DR:1; /* PD6DR */ unsigned short PD5DR:1; /* PD5DR */ unsigned short PD4DR:1; /* PD4DR */ unsigned short PD3DR:1; /* PD3DR */ unsigned short PD2DR:1; /* PD2DR */ unsigned short PD1DR:1; /* PD1DR */ unsigned short PD0DR:1; /* PD0DR */ } BIT; /* */ } PDDRL; /* */ }; /* */ void main(void) { output(&P_PORTD.PDDRL.BIT.PD4DR,0xff); output(&P_PORTD.PDDRL.BIT.PD5DR,0xff); output(&P_PORTE.PEDRL.BIT.PE12DR,0xff); } void output(unsigned short* port,int data) { P_PORTE.PEIORL.WORD = 0x3fff; P_PORTE.PEDRL.WORD = data & 0xff; *port = 1; *port = 0; P_PORTE.PEIORL.WORD = 0x3f00; }

専門家に質問してみよう