【IDL】 图像显示程序(直接图形法与对象图形法混合显示)

2011年4月IDL培训班(第三天)的图像显示程序代码(现场发挥版,仔细看注释),重点在事件传递和响应。

效果图如下:




源代码:

;PRO abc,event
;  file = DIALOG_PICKFILE()
;  read_jpeg,file,data
;  tv,data,/true
;END
PRO MAIN_EVENT,event
  ;
  WIDGET_CONTROL, event.TOP,get_uvalue= str
 
  CASE WIDGET_INFO(event.ID,/uName) OF
    'seldraw1': BEGIN
     str.SELIDX=0
     WIDGET_CONTROL, event.TOP,Set_uvalue= str
    END
    'seldraw2': BEGIN
     str.SELIDX=1
     WIDGET_CONTROL, event.TOP,Set_uvalue= str
    END
    'OpenJPG': BEGIN
     file = DIALOG_PICKFILE(path = 'd:\temp',filter='*.jpg')
     IF file EQ '' THEN RETURN;
     WIDGET_CONTROL, str.WFILELIST, set_value= file
    END
    'Show': BEGIN
     WIDGET_CONTROL, str.WFILELIST, get_value= file
     IF FILE_TEST(file) THEN BEGIN
     
       READ_JPEG,file,data
       ;  ;调用ENVI数据打开,则数据支持就无敌了,ENVI能打开的程序都能显示。
       ;       ENVI_OPEN_FILE, file, r_fid=fid
       ;       ENVI_FILE_QUERY, fid, dims=dims,ns= ns, nl =nl,DATA_TYPE = DATA_TYPE
       ;       ;
       ;       data  = make_array(3,ns,nl,TYPE = DATA_TYPE)
       ;       for i=0,2 do begin
       ;         data[i,*,*] =  ENVI_GET_DATA(fid=fid, dims=dims, pos=i)
       ;       endfor
       
       ;直接图形法
       IF str.SELIDX EQ 0 THEN  BEGIN
         ;WSET,str.WDRAW2
         str.OIMAGE->SETPROPERTY,/hide
         str.WDRAW2->DRAW,str.OVIEW
         ERASE
         WSET,str.WDRAW1
         TVSCL,data,/true
       ;tvscl,data
       ;对象图形法
       ENDIF  ELSE BEGIN
         WSET,str.WDRAW1
         ERASE
         str.OIMAGE->SETPROPERTY,data = data,hide=0
         str.WDRAW2->DRAW,str.OVIEW
       ENDELSE
     ENDIF
    END
    ELSE:
  ENDCASE
END
;析构函数
PRO MAIN_CLEANUP,tlb
  ;
  WIDGET_CONTROL, tlb,get_uvalue = str
  OBJ_DESTROY,str.OVIEW
 
END

PRO TEST_WIDGET1
  ;
 ;         wBase-
 ;         /   \      \
 ;   wContro   wbase      Bar
 ;     /   \         /    \
  ;  wButton wButton  wDraw  wdraw
  ; 
  wbase = WIDGET_BASE( $;xsize =800, $
    ;ysize =600,$
    /column, $
    mbar = bar)
  ;菜单
  wFile =WIDGET_BUTTON(bar, value= '文件(&F)')
  wOpen =WIDGET_BUTTON(wFile, value= '打开(&O)',$
   uname='OpenJPG')
  ;按钮
  wControl = WIDGET_BASE(wBase,/row,/frame)
  wbutton = WIDGET_BUTTON(wControl,value='打开jpeg',$
   uname='OpenJPG')
  ;,EVENT_PRO='abc')
  ;若button指定触发事件abc,则自动触发abc,event
  wFilelist = WIDGET_TEXT(wControl)
  wbutton1 = WIDGET_BUTTON(wControl,value='显示jpeg',uname='Show')
  ;显示控制
  wSelectbase = WIDGET_BASE(wControl,/EXCLUSIVE,$
    /row)
  wSelDraw1 = WIDGET_BUTTON(wSelectbase,value= 'selDraw1',$
   uname='seldraw1')
  wSelDraw2 = WIDGET_BUTTON(wSelectbase,value= 'selDraw2',$
   uname='seldraw2')
  WIDGET_CONTROL, wSelDraw1,/set_button
  ;显示
  wDrawBase = WIDGET_BASE(wBase, /row)
  wDraw1 = WIDGET_DRAW(wDrawBase,xsize = 400,ysize =400)
  wDraw2 = WIDGET_DRAW(wDrawBase,xsize = 400,ysize =400,$
   GRAPHICS_LEVEL = 2)
  ;
  WIDGET_CONTROL,wbase,/realize
  ;
  WIDGET_CONTROL,wDraw1,get_value = wDraw1ID
  WIDGET_CONTROL,wDraw2,get_value = wDraw2ID
  ;
  oImage = OBJ_NEW('IDLgrImage')
  oModel = OBJ_NEW('IDLgrModel')
  oView = OBJ_NEW('IDLgrView',viewplane_rect=[0,0,500,500])
  ;
  oVIew->ADD,oModel
  oModel->ADD,oImage
  ;用的结构体,一般用指针更好一些。
  struct = {wFilelist:wFilelist, $
    selIdx: 0b, $
    oImage: oImage, $
    oView:oView, $
    wDraw1: wDraw1ID,$
   wDraw2:wDraw2ID} ;IDLgrWindow对象
   
  WIDGET_CONTROL, wBase, set_uvalue = struct
  ;
  ;关联产生事件
  XMANAGER, 'main', wbase, /NO_BLOCK,$
    cleanUP = 'main_cleanup'
   
END

 

posted @ 2024-06-28 14:29  地理遥感生态网平台  阅读(21)  评论(0编辑  收藏  举报