• ベストアンサー

画像変換の高速化

titokaniの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

>で書き込みメディアがCFです CF上で作業していたら、そんなスピードかもしれません。 試しに、CF上でファイルのコピーを行うとどのくらいかかるでしょうか? もし、ファイルをコピーするだけでも5分程度かかるのであれば、なにをどう頑張ってもそれ以上早い処理は不可能です。 以後は余談なのですが、 >今はPC Dosの環境で作業しております。 PC Dosというと、16ビット環境になります。 VC++6で16ビット環境の開発はできませんから、どちらかに勘違いがあると思います。 普通、Windows2000とかXPとかで使われる、DOSのような画面は、「コマンドプロンプト」と呼びます。 でも、 >CPUインテルPentium3(クロックはちょっと分かりません) ということから、本当にPC-DOSである可能性も捨てきれず・・。 PC-DOSでVC++6.0は動かないから、クロス開発? でも、PC-DOSにCFのドライバなんてあったかな??

siriusu-1
質問者

補足

お返事ありがとうございます。 >PC-DOSでVC++6.0は動かないから、クロス開発? いえ、えーと書き方が悪かったようで、マイクロソフトC のVer6 です。 >でも、PC-DOSにCFのドライバなんてあったかな?? よく分からないのですが、Windows98のPCを改造してPC-DOSマシンにしてあるらしく、CFが使えるようになっています。 Microsoft Visual C++ 2005の環境もあります。(ただ、全く勉強をしていないので使えないのですが) >試しに、CF上でファイルのコピーを行うとどのくらいかかるでしょうか? 同じものをコピーして5秒程でした。 かなり凹んでます。

関連するQ&A

  • C#にて、イメージ画像の分割

    C#言語にて現在パズルゲームを作成しようと考えています。 パズルに使用するピースですが、ユーザが任意に選択した画像をプログラミングで規定の画像サイズに切り出し、それをパズルピースとして使用する仕様を考えています。 ファイルを開くボタン押下で、OpenFileDialogを表示し、ユーザに任意のイメージ画像を選択させます。その選択された画像を58pixcelx58pixcelのサイズの画像を9x6の54枚(パズルピース)に分割します。 以下がその仕様を考えたソースコードです。 private void selectButton_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) imageShow(openFileDialog.FileName); } private void imageShow(string filePath) { Bitmap _bmp = new Bitmap(58, 58); Image originalImage = Image.FromFile(filePath); Graphics g = Graphics.FromImage(_bmp); Rectangle rect; int x = 0; int y = 0; string title = "C:\\Image"; int index = 0; for (x = 0; x < 9; x++) { for (y = 0; y < 6; y++) { index++; rect = new Rectangle((x * 58) , (58 * y), 58, 58); g.DrawImage(originalImage, 0, 0, rect, GraphicsUnit.Pixel); _bmp.Save(title + index.ToString()+ ".jpg",System.Drawing.Imaging.ImageFormat.Jpeg); Thread.Sleep(50); } y = 0; } } パズルピースとして使用する予定のサイズ58x58のBitmapを作成します。そのBitmapからGraphicsを作成し、Graphicsに対してDrawImageでオリジナル画像(ユーザが選択した画像)を58Pixcelごとに分割し、分割されて作成されたImageをSave()にてファイル保存しています。 この仕様で一応ファイルは分割されて作成されるのですが、どうも画像の位置が合わないのです。画質も悪いですし。手動で同じオリジナルファイルを58Pixcelごとに切り出したものと比較しますと顕著にちがいます。 何か足りない処理や、他の対応策がございましたらご教授のほどよろしくお願いいたします。今回の仕様で、切り出したファイルをローカルマシンに保存する、と言うのは必須事項になっております。 どうか皆様よろしくお願いいたします。

  • C++ Builderにおける画像データの取得について

    C++での画像処理プログラムの研究をしている者です。 文字数制限がありますので簡潔になりますがよろしくお願いします。 担当教官から基本となるプログラムをいただいたのですが実行するとエラーが出てしまいます。 プログラム内容: void TImg::ImgMemToBmp(Graphics::TBitmap *bmp, BYTE *img) { GetBmpHdr(); // ビットマップヘッダー取得 String fileName = StartDir + "\\tmp.bmp"; FILE *fp;if (NULL == (fp = fopen(fileName.c_str(), "wb"))) return; fwrite(BmpHeader, 54, 1, fp); // ヘッダー //******** 画像書き込み ******** BYTE *p, *img1 = (BYTE *)malloc(Pixel_X_Max*3); for (int y=0; y<Pixel_Y_Max; y++) { p = img + (Pixel_Y_Max-y-1) * Pixel_X_Max; for (int x=0; x<Pixel_X_Max; x++) { *(img1+3*x) = *(img1+3*x+1) = *(img1+3*x+2) = *(p+x); } fwrite(img1, Pixel_X_Max*3, 1, fp); } fclose(fp); bmp->LoadFromFile(fileName); // BMPファイル読み込み DeleteFile(fileName); free(img1); // 不要ファイル、メモリ削除 } 問題点:下から3行目の bmp->LoadFromFile(fileName); でクラスの例外が発生しました。"ビットマップが不正です"とのエラーが出ます。 私なりにプログラムを解析してみたところ で、tmp.bmpというファイルを作りそこに白黒画素値を書き込んでいるように思うのですが 途中で止めてtmp.bmpのサイズを確認してみたところ 原画像が640×480の画像でtmp.bmpのサイズは20971840×15728640となっていました。 これが原因でエラーと出たのではないかと考えたのですがいかがでしょうか? 補足要求していただければ、適宜補足いたしますので どうかご助力をよろしくお願いいたします。

  • より高速な画像の表示法

    医療画像(DICOM)のバイナリデータを読み込んで表示させるプログラムを作っているのですが、非常に遅い(約4秒)ので改善したいのです。 おそらく、ループ中での、エンディアンの変換とPixelへの張付けが原因と思うのですが、改善方法が判りません。宜しくお願いします。 BolandC++Builder6,Pentiam4,1Gメモリ,XPの環境です。 DICOMO画像のファイルサイズは約2053kB 画像データは1024*1024の16ビットです。 __________________________________ Byte bb[2097152]; int iImage[512][512]; word c,wData; fp=fopen("filename","rb"); setvbuf(fp,NULL,_IOFBF,4096*1024*1024); while(gData!=0xE07F) //グループタグの検索// fread(& gData,2,1,fp); while(eData!=0x1000) //エレメントタグの検索// freadd(& eData,2,1,fp); fread(&wData,2,4,fp); //空読み// fread(bb,1,2097152,fp); //画像データ// fclose(fp); for(y=0;y<=512;y++){ for(x=0;x<=512;x++){ wData=256*bb[4*x+4096*y]+bb[4*x+4096*y+1]; c=wData*256/4096; iImage[x][y]=c; Image->Canvas->Pixels[x][y]=(TColor)((c<<16)|(c<<8)|c); c=0; } }

  • BMP画像を画像処理して連続に表示したいですが?

    プログラミングの初心者ですが、現在VC++2005のフォームアプリケーションでプログラムについて勉強しています。画像を連続表示するところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 やりたい処理は、取り込んだ画像の色を変化させて、順番に表示したい 処理です。作成したプログラムは下記のようになります。 前略 for(n=0; n<256; n+=20){ for(y=0; y<480; y++){ for(x=0; y<640; x++){ bmp->Setpixel(x, y, Color::FromArgb(n, n, n)); } } pictureBox->Image = bmp; Thread::Sleep(2000); } nの値をbmpに入れてから一回表示し、さらにnを足してからbmpに入れて表示するといった流れですが、Sleepを入れても何にも表示されません。 どういったところは不具合なのかをよくわかりません。 ご指導をいただければ感謝致します。どうぞよろしくお願い致します。

  • クリックした位置に画像を貼り付ける方法

    開発環境はWinXP、C++、MFCを使っています。 C++を勉強し始めた初心者です。 画面上で左クリックされた位置に画像(ビットマップ画像)を表示させる簡易プログラムを作ろうとしています。 ここで、マウスの位置を取得する方法がわかりません。理解しやすい方法があれば押してください。 ちなみにこんな感じでつくってます。。。↓ void Canvas::MakeStamp() //Canvas ・MaskStamp共に任意の名前 { // //ここでマウスの位置を取得したいです // //画像を貼り付け CClientDC cdc(this); CDC bmpCDC; bmpCDC.CreateCompatibleDC(&cdc); CBitmap bmp; bmp.LoadBitmap(STAMP); //STAMPは任意の名前 bmpCDC.SelectObject(bmp); cdc.BitBlt(X,Y,60,60,&bmpCDC,0,0,SRCCOPY); //ここのX,Yはクリックした座標を当てはめるつもりです。 } よろしくお願いします。

  • 行列 1次変換

    次の平面上の変換は1次変換か否かを調べ、1次変換であるもの については、1次変換を表す行列を求めよ。 (1)平面上の任意の点Pに点Pを対応させる変換(恒等変換) (2)点P(x、y)をx軸方向に2、y軸方向に-1だけ平行移動した点を P’(x’、y’)とする変換 (3)点P(x、y)を原点を中心に角π/3だけ回転させた点をP’(x’、y’) とする変換 この三つの問題なんですが (1)は恒等変換なので (x’)=(1 0)(x)=(x) (y’)=(0 1)(y)=(y)  (2段で書いていますが1段と考えて) でよいですか? あとの二つはわかりません。お願いします。

  • Octave画像ファイルの向きを上下逆さまにしたい

    % lec5_2.m % bmp画像出力(画像*****のプログラム) % % Input.bmp : 処理したい画像(モノクロ)BMPファイル % Output.bmp : 処理したい画像(モノクロ)BMPファイル clear all, close all % おまじない Iin=imread('LENNA.bmp'); % 画像の入力 figure, imshow(Iin) % 画像表示 [y_size,x_size]=size(Iin); %縦横のサイズ % 配布資料を参考にして以下の2重for文の % 中のプログラムを完成させよ for n=3:y_size for m=3:x_size n2=y_size-n+1; Iout(n,m)=Iin(n2,m); end end % プログラム修正ここまで figure, imshow(Iout) % 画像表示 bmpwrite_bk(Iout,'LENNA.bmp','Output.bmp'); % End of file 上記はOctaveのmファイルの中身ですが、これを使用すると画像の上下を反転させることができます。 これを、『画像を上下逆さまに回転』させ、元の画像を下向きにして表示させたいです。それをするには二重for文の内容を変えるみたいなのですが、どう変えればいいかわからず途方に暮れています。 二重for文の内容をどう変えたら成功するのでしょうか。 mファイルをどう弄ったらいいかもわからない初心者の質問です。よろしくお願いします。

  • UWSCのスクリプトについて

    画像Dを認識したら画面上に画像Bがあっても 処理Bを実行しない為にはどうしたら良いでしょうか。 -------- while True BTN(LEFT,click,150,10,110)   //処理A Sleep(2) ifb CHKIMG("A.bmp")    x=G_IMG_X            y=G_IMG_Y BTN(left,click,x,y,110) Sleep(1.5) endif Ifb ChkImg("B.bmp")       //処理B BTN(LEFT,click,1120,90,110) Sleep(1) KBD(VK_return,DOWN,30) endif ifb CHKIMG("C.bmp")      //処理C x=G_IMG_X            y=G_IMG_Y BTN(left,click,x,y,110) Sleep(1.5) wend --------

  • 複数枚画像の合成

    こんにちわ、Visual Studio 2005のフォームアプリケーションでプログラミングしているものです。複数枚の画像を一つの画像にしたいのですが、どうもあっているのかどうかわかりません。 たとえば、画像が9枚あって1枚目の一番左上の画素を[0-0,0]とすると、 [0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0] [0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0] [3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0] [3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0] [6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0] [6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0] -----------------+-----------------+------------------------ [0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1] [0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1] [3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1] [3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1] [6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1] [6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1] -----------------+-----------------+------------------------ [0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2] [0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2] [3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2] [3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2] [6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2] [6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2] といった感じにしようと思っています。 画像には配列を使っていてbmp[0]~[8]が9枚の画像を表し、picはbmp[0]~[8]の画像一枚に対してサイズが横3倍縦6倍の画像になるはずです。 自分でプログラムしたのですが、できた画像を拡大しても細かすぎてよくわからない状況です。 for ( y = 0; y < h; y += 6 ) {  for ( x = 0; x < w; x += 3 ) {   for( b = 0; b < 3; b++ ) {    for( a = 0; a < 3; a++ ) {      pic->SetPixel( x + a, y + (2 * b) , bmp[((2 * b) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );      pic->SetPixel( x + a, y + (2 * b) , bmp[(((2 * b) + 1) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );    }   }  } } 以前に、同じような配置法なのですが横3倍縦3倍の合成画像として、 [0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0] [3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0] [6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0] -----------------+-----------------+------------------------ [0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1] [3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1] [6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1] -----------------+-----------------+------------------------ [0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2] [3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2] [6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2] の配置プログラムとして、 for ( y = 0; y < h; y += 3 ) {  for ( x = 0; x < w; x += 3 ) {   for( b = 0; b < 3; b++ ) {    for( a = 0; a < 3; a++ ) {      pic->SetPixel( x + a, y + b , bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 3 ) );    }   }  } } との回答をいただいたので、これを参考に作ってみたのですが・・・。 説明が下手でわかりにくいかもしれませんが、お分かりの方がいましたらご教授お願いします。

  • ラプラス変換で連立微分方程式を解くとき

    お願いします。 連立微分方程式をラプラス変換で解くとき、 たとえばx'をラプラス変換すると sL(x) - x(0) のようにx(0)が出てきますよね。 ラプラス変換の問題集の場合たいてい初期条件が付いているのですが、 初期条件がない場合はこのままx(0)を答えに使用してもよいのでしょうか。 たとえば演算子法で解く問題の場合、 x' = x - 4y y' = x + 5y となっていて、問題集の回答の通り微分演算子で解けば 答えは x = {(C2 - 2C1) - 2C2t}exp(3t) y = (C1 + C2t)exp(3t) (C1,C2は任意定数) となります。一方ラプラス変換で解くと x = (x0 - (2x0 + 4y0)t)exp(3t) y = (y0 + (x0 + 2y0)t)exp(3t) (x0 = x(0),y0 = y(0)) となります。 これは実は C1 = y0, C2 = x0 + 2y0 と置き直すと同じになります。ここで質問です。 (1)このような問題でふつうは任意定数を使うべきでしょうが、 x(0),y(0)を使ったら不正解なのでしょうか。 (2)そもそもx(0),y(0)は任意定数になるのでしょうか。 (3)なんだかラプラス変換があれば微分演算子法は いらない子のような気もしなくはないのですが 気のせいでしょうか? 以上です。よろしくお願いいたします。