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")