画像ファイル読み込み

 投稿者:しばっち  投稿日:2019年 9月26日(木)20時14分9秒
  open cvライブラリーを使用して、十進BASICが対応する画像ファイルの種類が増えました。
但し、gif形式には未対応です。

なお、実行時にはopencv_world300.dllが必要です(BASIC.EXEと同じフォルダに入れてください)

下記URLからダウンロードしてください。(imagetool.zip)

https://36.gigafile.nu/1125-n8d2d72a2da1c926a4d213cd6f41f8bd3

ダウンロード期限:2019年11月25日(月)
ダウンロードキー:設定していません


※警告
open cvは日本語パスに対応していません。


FILE GETNAME IMAGENAME$,"画像ファイル|*.bmp;*.dib;*.jpg;*.jpe;*.jpeg;*.jp2;*.png;*.pbm;*.pgm;*.ppm;*.sr;*.ras;*.tif;*.tiff;*.webp"
CALL IMAGELOAD(IMAGENAME$)
END

EXTERNAL SUB IMAGEINFO(FILENAME$,WIDTH,HEIGHT)
OPTION CHARACTER BYTE
LET WIDTH$=REPEAT$(CHR$(0),8)
LET HEIGHT$=REPEAT$(CHR$(0),8)
LET NUM=IMAGEINFO_(FILENAME$,WIDTH$,HEIGHT$)
IF NUM=-1 THEN
   PRINT "画像ファイルをロードできません"
   STOP
END IF
LET WIDTH=UNPACKDBL(WIDTH$)
LET HEIGHT=UNPACKDBL(HEIGHT$)
PRINT WIDTH;HEIGHT
!'
FUNCTION IMAGEINFO_(FILENAME$,WIDTH$,HEIGHT$)
   ASSIGN ".\DLL\imageload.dll","imageinfo"
END FUNCTION
END SUB

EXTERNAL  SUB IMAGELOAD(FILENAME$)
OPTION BASE 0
OPTION CHARACTER BYTE
IF FILENAME$="" THEN STOP
CALL IMAGEINFO(FILENAME$,WIDTH,HEIGHT)
LET MAP$=REPEAT$(CHR$(0),WIDTH*HEIGHT*3+100)
LET NUM=IMAGELOAD_(FILENAME$,MAP$)
IF NUM=-1 THEN
   PRINT "画像ファイルをロードできません"
   STOP
END IF
DIM M(WIDTH,HEIGHT)
CALL GINIT(WIDTH,HEIGHT)
FOR Y=0 TO HEIGHT-1
   FOR X=0 TO WIDTH-1
      LET ADR=(Y*WIDTH+X)*3+1
      LET R=ORD(MAP$(ADR+2:ADR+2))
      LET G=ORD(MAP$(ADR+1:ADR+1))
      LET B=ORD(MAP$(ADR:ADR))
      LET M(X,Y)=COLORINDEX(R/255,G/255,B/255)
   NEXT X
NEXT Y
MAT PLOT CELLS,IN 0,0;WIDTH-1,HEIGHT-1:M
!'
FUNCTION IMAGELOAD_(FILENAME$,MAP$)
   ASSIGN ".\DLL\imageload.dll","loadimage"
END FUNCTION
END SUB

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET COLOR MIX(0) 0,0,0
SET COLOR MODE "NATIVE"
CLEAR
SET POINT STYLE 1
SET WINDOW 0,XSIZE-1,YSIZE-1,0
END SUB

-----------------------------------------------------------------------------
                       imageload.cpp


#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

extern "C"  __declspec(dllexport) int imageinfo(char *filename,double *width,double *height)
{
    Mat image = imread(filename, 1);
    if(!image.data) return -1;
    *height=image.rows; //縦の大きさ
    *width=image.cols; //横の大きさ
    return 0;
}

extern "C"  __declspec(dllexport) int loadimage(char *filename,char *framedata)
{
    Mat image = imread(filename, 1);
    if(!image.data) return -1;
    int height=image.rows; //縦の大きさ
    int width=image.cols; //横の大きさ
    for(int y=0; y<height; y++)
        for(int x=0; x<width; x++)
            for(int c=0; c<3; c++)
                framedata[(y*width+x)*3+c]=image.at<cv::Vec3b>(y,x)[c]; // c=0 blue, c=1 green, c=2 red
    return 0;
}
 

戻る