Octave バージョン 3.2.4 で imread, imfinfo, file_in_path 等が動かないバグ

バグの内容

Octave 3.2.4 で,imread, imfinfo等を実行しようとすると, ファイルは存在するのに,「C:\Octave\3.2.4_gcc-4.4.0\share\octave\3.2.4\m\image\imread.m imread: cannot file ...」のようなエラーメッセージが出て進まない.

imread("r:/lena_std.jpg")

バグの原因

file_in_path の振る舞いがおかしい

* バージョン 3.2.3 での実行例(ディレクトリを絶対パスで指定している.ファイル名が得られている).

* バージョン 3.2.4 での実行例

ディレクトリを絶対パスで指定している.ファイル名が得られない.

ディレクトリを相対パスで指定している場合.この場合も,ファイル名が得られない.

file_in_path.m の書き換え

Window の minGW 版 Octave の場合, ファイル名は,C:\Octave\3.2.4_gcc-4.4.0\share\octave\packages\oct2mat-1.0.7/file_in_path.m になる

* 書き換え前


function name=file_in_path(p,file)
  idx=[1 findstr(p,pathsep) length(p)+1];
  for i=1:length(idx)-1
    if idx(i+1)-idx(i)<=1, continue; end
    dir=p(idx(i)+1:idx(i+1)-1);
    name = fullfile(dir, file);
    fid = fopen(name,"r");
    if fid >= 0,
      fclose(fid);
      return
    end
  end
  name=[];

* 書き換え後


function name=file_in_path(p,file)
  idx=[1 findstr(p,pathsep) length(p)+1];
  for i=1:length(idx)-1
    if idx(i+1)-idx(i)<=1
      dir=strcat(pwd,"/");
    else
      dir=p(idx(i)+1:idx(i+1)-1);
    end
    name = fullfile(dir, file);
    fid = fopen(name,"r");
    if fid >= 0
      fclose(fid);
      return
    end
  end
  fid = fopen(file,"r");
  if fid >= 0,
    fclose(fid);
    name=file;
    return
  end
  name=[];

* 試しに実行してみる

  • 相対パスを入力→絶対パスを出力
    file_in_path(IMAGE_PATH, "2CT10380.bmp")
    
  • 絶対パスを入力→絶対パスを出力
    file_in_path(IMAGE_PATH, "c:/test/2CT10380.bmp")