  Ŀ
  Ŀ
                                                                          
                  QuickBasic'de resimlere ksa bir bak                  
                                                                          
  ٳ
   PS 25  Austos'95                                Grol Demir            
  
                                                                              
       retilen bir maln kalitesi yannda bu maln sunumu da nemlidir.
  Bilgisayar  alannda  son  yllarda  grsel  ve  iitsel anlamda bir seri
  gelimeler olmutur. Gnmz programclnda yaplan programlara grafik
  ve ses zellikleri eklemeye ihtiya duyulmaktadr.
                                                                              
       Bu yazmzda programlarn grsel sunumlarnn glendirilmesi
  amacyla, bilgisayarda resim teknolojisine (skc ayrntlara girmeden)
  bilgimiz dahilinde ksaca deinilecektir.


> Ekran kartlar ve VGA :

       1987 Ylnda retimine geilen VGA ekran kartlar 16.777.216 adet 
  renk paleti iinden 320x200 znrlkte 256 renk salamaktadr.VGA kartlar 
  ile birlikte analog sinyaller devri balamtr. Gnmzde artk Hercules,
  CGA, EGA ekran kart kullanan bilgisayar yok gibidir. 

       Bir programn alt bilgisayardaki ekran kartnn VGA olup
  olmadn anlamas son derece basittir. QuickBasic iersinden "SCREEN 13"
  komutu hata vermeden alyorsa bu makinede VGA kart takl demektir.
                                                                              
       Resim denilince akla gerek resim geldiinden, gerek resimler ise 
  ancak VGA ve st kartlar ile rneklenebildiinden bu yazmzda sadece
  VGA ve st ekran kartlarnda gsterilebilen grafiklerden bahsedilecektir.
                                                                              
                                                                              
> RESMLER EKRANA NASIL GELR :

       Herhangi bir program, herhangi bir resmi ekranda gstermek iin drt
  ilem yapmak zorundadr.
                                                                              
         1. Ekran gsterim modunun ayarlanmas
         2. Palet ve kenar renklerinin seilmesi 
         3. Renk yazmalarnn bilgilendirilmesi 
         4. Resme ait datalarn video belleine yazlmas

       Bir programc ekranda resim gstermek istiyorsa bu drt ilemi bilmek
  durumundadr. Bunlar srasyla ele alalm.

                            
Ekran gsterim modu
                            


  Standart bir VGA kart aadaki ekran modlarn sunar;
  Ŀ
           Mod   Tip      Ebat      Renk  Sayfa  Adres   Karakter Matrisi   
                              
            00   Text     40X25      16     8    B800     8x8 ,8X14 ,9X16   
            01   Text     40X25      16     8    B800     8x8 ,8X14, 9X16   
            02   Text     80X25      16     8    B800     8x8 ,8x14, 9x16   
            03   Text     80X25      16     8    B800     8x8 ,8X14, 9x16   
            04   Grafik   320X200     4     1    B800     8x8               
            05   Grafik   320X200     4     1    B800     8x8               
            06   Grafik   640X200     2     1    B800     8x8               
            07   Text     80X25       2     8    B000     9X14, 9X16        
            0D   Grafik   320X200    16     8    A000     8x8               
            0E   Grafik   640X200    16     4    A000     8x8               
            0F   Grafik   640X250     2     2    A000     8x14              
            10   Grafik   640X250    16     2    A000     8x14              
            11   Grafik   640X480     2     1    A000     8x16              
            12   Grafik   640X480    16     1    A000     8x16              
            13   Grafik   320X200   256     1    A000     8x16              
         *  4F   Text     132X60     16     2    B800     8x8               
         *  50   Text     132X25     16     8    B800     8x14              
         *  51   Text     132X43     16     5    B800     8x8               
         *  52   Grafik   800X600    16     1    A000     8x8               
   (SVGA)*  25   Grafik   640X400   256     1    A000     8x16              
   (SVGA)*  26   Grafik   640X480   256     1    A000     8x16              
  


       Son alt mod ekran kartna gre deiiklik gsterebilir. Ancak 
  batan itibaren 13H nolu moda kadar olan gsterim modlar btn VGA ekran
  kartlarnda standarttr.

       Diyelim ki 13H nolu gsterim modu iin ekran hazrlamamz gerekiyor
  bunun iin "SCREEN 13" komutunu vermemiz yeterlidir.Bu yntem kk modlar
  iin geerlidir.Peki 26H modu iin ne yapabiliriz.Basic'de bunun iin komut
  yoktur.Dier programlar bunu esas olarak iki yntemle zerler; 

         a)Dos'un 10H nolu kesmesini kullanmak, 
         b)6845 CRT-Kontrol registerlerini programlamak.

       kinci yntem oldukca kark olmas nedeniyle pek tercih edilmez
  ve genellikle emlasyon ilemlerinde kullanlr.Biz okca kullanlan birinci 
  yntemi ele alalm:

       AH registerine 0, AL registerine istediimiz mod numarasn verip
  interrupt 10H'yi ardmzda istediimiz video moduna geeriz.

  rnein 640x480 256 renk bir ekram iin mod 26H'ya ayarlama; 
         
         MOV AH,0
         MOV AL,26h
         INT 10

  eklinde bir assembly yordam yeterlidir.

> Ayn iin QuickBasic'de yaplmas;
        
  Ŀ
                                                                            
        'Program versiyon 4.5 de QB /L QB                                  
        '   "        "     7.1 de QBX / L QBX eklinde ykleyin             
        '$INCLUDE:'QB.BI' :'Versiyon 7.1 de QBX.BI olacak                   
        DIM SHARED Regs AS RegType                                          
        Regs.Ax=&H0026                                                      
        CALL Interrupt (&H10,Regs,Regs)                                     
                                                                            
  

                                
Palet ve kenar renkleri  
                           
       16 adet palet registeri ve 1 adet kenar renk registeri vardr.
  Bu registere renk deerlerinin girilmesi gerekir.VGA ekranda renkler yeil,
  mavi ve krmznn deiik tonlarnn karmndan oluur.Bu registerlere 
  gnderilen birer byte ile paletler ve kenar rengi iin seim yaplm olur.

       17 Byte'lk bilginin adresi ES:DX ile adreslenir, AH registerine 10H
  AL registerine 2 deeri verilip 10H nolu kesme arlrsa paletlerin ve
  kenar izgisinin rengini semi oluruz.
         
> Bir rnek:
         
         PUSH CS       :' Renk bilgilerinin adresini ES:DX registerine aktar
         POP ES        :'  "       "           "       "       "         "
         MOV DX,146    :'  "       "           "       "       "         "
         MOV AX,1002h  :' 10 ncu fonksiyon 2 nci alt fonksiyon
         INT 10h       :' Kesmeyi ar

       Btn resimler palet ve kenar renk yazmalarn ayarlamazlar.Burda
  mevcut deerleri default olarak alabilirler.
              
                                                                
Renk yazmalar
                               

       VGA Ekran kartnda tam 256 adet renk registeri vardr.Bu yazmaclar
  24 bitlik yazmalardr.lk sekiz bit yeil deerini, ikinci sekiz bit mavi
  deerini ve son sekiz bit de krmznn alaca deeri gsterir.Sekiz bit
  ile 256 farkl deer ifade edilebilir.Bylece 256 yeil,256 mavi ve 256
  krmz renklerinin alaca fark deerler ile 256*256*256= 16.777.216 adet
  farkl renk elde edebiliriz.Bylece doadaki btn renkleri gsterebiliriz.

       Ancak unutulmamas gereken bir olay elimizde sadece 256 adet renk
  registeri bulunmasdr.16 milyon rengi gsterebilmemize ramen bir defada 
  bunlardan sadece kafamza gre seeceimiz 256 adedini gsterebiliriz.

       256 Adet renk registerimiz olduuna gre ve bunlar yeilin deeri
  iin bir, mavinin deeri iin bir ve krmznn deeri iin bir olmak zere
  toplam er byte'lk bilgi ile bilgilendirmemiz iin bize 256x3=768 byte
  gereklidir.

       ES:DX adresine bu 768 byte'lk bilginin adresini, CX registerine
  kac renk registerini set edeceimizi, BX registerine kanc renk 
  registerinden balaycmz bildirir, AH'ye 10H, AL'ye 12H deerini verip 
  10H nolu kesmeyi arrsak kullanacamz renk deerlerini semi oluruz.

>  Bir rnek:
         
         PUSH CS       :' Renk bilgilerinin adresini ES:DX registerine aktar
         POP ES        :'  "       "           "       "       "         "
         MOV DX,157    :'  "       "           "       "       "         "
         MOV CX,100h   :' 256 renk registerinin tamamn ayarla
         MOV BX,0000   :' 1 nci renk registerininden bala
         MOV AX,1012h  :' 10 ncu fonksiyon 12 nci alt fonksiyon
         INT 10h       :' Kesmeyi ar


                  
Resme ait datalarn video belleine yazlmas
                  


       Video bellei gsterim modu bahsinde de tablo olarak gsterildii
  balca iki temel adresten balar biri B800H dieri A000H adresidir.

       Resme ait datalar bu adreslerden balayarak video belleine 
  yazlr. Btn gsterim modlar iin video belleine yazlma ilemlerinin
  anlatlmas 1000 sayfalk bir kitap tutabilir.Bu nedenle bize gerekli olan
  zet bilgileri vermek uygun sanrm.
         
       13H nolu gsterim modu 320x200 ebatta 256 renkli resimleri A000H
  adresine yazar.Burda her bir renk iin sekiz bit yeterli olduundan resme 
  ait datalar 320x200=64K byklndedir.Bu gsterim modu her renk iin tek 
  byte kullandndan hesaplanmas son derece basittir. rnein A000H:0000 
  adresindeki byte 0,0 koordinatlarndaki pikselin renk deerini gsterir. 
  Ayn ekilde 10,20 koordinatlarnda 200 nc rengin kullanlmasn istersek 
  yapmamz  gereken ey A000H:20*320+10 adresine 200 deerini aktarmak 
  olacaktr.Hesaplama basitiinden ve direkt bellek ilemlerinin kolaylndan 
  dolay bu gsterim modunda basic dilinin BSAVE ve BLOAD komutlar baaryla 
  uygulanr. Bu konuda bir rnek yaznn sonlarna doru verilecektir. 

       06H nolu gsterim modu 640x200 ebatta 2 renkli resimleri B800H
  adresine yazar.Burda her bir renk iin bir bit yeterli olduundan resme ait
  datalar 640x200/8=16K byklndedir.

       05H nolu gsterim modu 320x200 ebatta 4 renkli resimleri B800H
  adresine yazar.Burda her bir renk iin iki bit yeterli olduundan resme ait
  datalar 320x200/4=16K byklndedir.
         
       0DH nolu gsterim modu 320x200 ebatta 16 renkli resimleri A000H
  adresine yazar.Burda her bir renk iin drt bit yeterli olduundan resme ait
  datalar 320x200/2=32K byklndedir.

       Buraya kadar sorun yoktur.nk video bellei bu resimleri gstermek
  iin yeterlidir.Dos iletim sistemi bu bellee dorudan eriim yapacak rutin
  ve kesmelere haizdir.
          
       Dos'un dorudan kullanabildii bellee ksaca bir gz atalm;

         0            A000H     Video Bellei       B000H        FFFFH
         ͼ

       Dos 256 renkli bir resmi sadece yukarda gsterilen A000H-AFFFH 
  aralna yazabilir ve okuyabilir. Bu araln ise boyu sadece 64K dr.

       Oysa ayn arala 640X480 ebatlarnda 256 renk kullanan bir resim
  boyutu 307.200 byte olduu iin smayacaktr.Bilgisayarda 256K bamsz 
  bellei olan VGA kart takl ise ayn adreslere birbirine paralel 4 bytelk
  veri yolu ilave edilir ve yukardaki ema u hale gelir;
         
         0            A000H     Video Bellei       B000H        FFFFH
         ͼ
                               Birinci Bank          
                        ͹
                               kinci Bank           
                        ͹
                               nc Bank           
                        ͹
                               Drdnc Bank         
                        ͼ

         
       Bylelikle A000H-AFFFH araln kullanan birbirine paralel 4 tane
  64K byklnde video bellei olur, bir tane de Dos'un kulland sfrnc
  bank' sayarsak toplam 64X5=320K byklnde video belleimiz var demektir.

       Banklar arasndaki veri aktarm ok hzldr.Bu 320K byklnde
  video belleine 20K byklnde 16 resim aktarrsak film bile oynatabiliriz.
          
       Ancak bu banklarn kullanlmas ve veri aktarm iin VGA kartnn 
  hardware yapsn iyi bilmek gerekir.Bu konuya ilikin kaynaa sahip deilim.

       Dos iletim sistemi kark bellek hesaplar yerine gvenli ancak 
  son derece yava bir yntem sunar piksel piksel okuma ve piksel piksel yazma.
  Bu yntem resim yakalama da programlama admlarnn basitliinden dolay sk
  kullanlr.Resmin gsteriminde ise yavalndan dolay tercih edilmez.
         




> RESMLERN EKRANDAN YAKALANMASI :

       Herhangi bir resmin ekranda gsterilmesi iin drt ilem yapmak 
  gerektiini belirtmitik.O halde resmin yakalanmas iin de drt ilemin
  yakalanmas gerekir. Yani bir resmi;
                                                                              
         1. Ekran gsterim modunun yakalanmas,
         2. Palet ve kenar renklerinin yakalanmas, 
         3. Renk yazmalarndaki bilgilerin yakalanmas,
         4. Resme ait datalarn yakalanmas,

  eklinde drt ilem ile yakalayabiliriz.

       Resimlerin yakalanmasnda yine Dos'un 10H numaral kesmesi kullanlr.
  Bu blm uzun uzun anlatmak yerine YAKALA.COM isimli bir program veriyorum.
  Yakala.Com program 645 byte uzunlukta bir resim yakalaycdr.

       alt zaman TSR olarak bellee yerleecek ve Alt+R tuuna baslp
  baslmadn kontrol edecektir.Eer Alt+R tuuna basld ise ekranda resim
  olup olmadn kontrol edecektir.Eer ekranda resim varsa bu resimleri
  A0.RSM, A1.RSM... isimleriyle kaydedecektir.

       Yakala.Com ile ekrandaki her formatdaki ve her moddaki sabit ve 
  hareketli resimleri yakalanabilir.

        
>  RESM DOSYA FORMATLARI :
         
       Bilgisayar ekrannda grlen resimlerin disk(et)te saklanmas iin 
  bir ok formatlar oluturulmutur. rnein sabit resimler GIF, PCX,TIF,LBM, 
  BMP,JPG ve benzer, hareketli resimler GL, DL, AVI ve benzer formatlarda
  saklanr.

       Bu resim formatlar ok eitli olduundan, bunlara hergn yenileri
  de ilave edilmekte olduundan (rnein bu ay RSM ve QRM isimli iki resim
  format daha ilave edeceiz...Bu yaznn sonunda isterseniz sizde yeni resim 
  formatlar gelitirebilirsiniz) her bir resim formatnn tek tek irdelenmesi
  uzun almalar alacaktr.

       Zaten ekrandaki ve disk(et)deki resmi eitli formatlara eviren
  ve yakalayan bir ok program bulunmaktadr.(PV,CSHOW,VGIF,GWS,GRASPRT vb.)

       nce kendi resim formatmz olan RSM formatna bir gz atalm. Bu
  format son derece basit bir yapda olduu iin ne aldm. Yakala.Com ile
  yakalanan resimler bu formattadr.
           

> RSM Dosya Format :
         
         Balang      Boy          Aklama
                 
           1 nci byte     3 byte     "G&D" iareti
           4 nc byte     1 byte     Video modu
           5 nci byte     1 byte     Renk says
           6 nc byte     2 byte     Resim genilii
           8 nci byte     2 byte     Resim ykseklii
          10 ncu byte    17 byte     Palet ve kenar renk bilgileri
          27 nci byte   768 byte     Renk yazma bilgileri
         801 nci byte   end byte     Resim piksel deerleri (datalar)

  Resim piksel deerleri her bir piksele bir byte ayrarak oluur.


> Rsm formatndaki bir resmin basic'de gsterilmesine bir rnek;
  Ŀ
                                                                            
       '----------------Program Balang----------------                  
       '********* Versiyon 7.1 iin QBX /L QBX eklinde yklenmeli          
       '********* RSM formatnda resim gsterimi                            
       '********* Hz=Yava                                                 
                                                                            
       '$INCLUDE: 'QBX.BI'                                                  
       DIM SHARED RegsX AS RegTypeX                                         
                                                                            
       'Dosyay a                                                          
       Dosya$ = "A0.RSM"                                                    
       OPEN Dosya$ FOR BINARY AS #1                                         
                                                                            
       'Video modunu ayarla                                                 
       A$ = " ": GET #1, 4, A$                                              
       RegsX.Ax = ASC(A$)                                                   
       CALL InterruptX(&H10, RegsX, RegsX)                                  
                                                                            
       'Palet ve renk deerlerini yerine koy                                
       Renkler$ = SPACE$(800)                                               
       GET #1, 10, Renkler$                                                 
       RegsX.Dx = SADD(Renkler$)                                            
       RegsX.Es = SSEG(Renkler$)                                            
       RegsX.Ax = &H1002                                                    
       CALL InterruptX(&H10, RegsX, RegsX)                                  
                                                                            
       'Renk Yazmalarn bilgilendir                                       
       RegsX.Dx = SADD(Renkler$) + 17                                       
       RegsX.Es = SSEG(Renkler$)                                            
       RegsX.Ax = &H1012                                                    
       RegsX.Bx = 0                                                         
       RegsX.Cx = &H100                                                     
       CALL InterruptX(&H10, RegsX, RegsX)                                  
                                                                            
       'Genilik ve ykseklii al                                           
       GET #1, 6, Gen%                                                      
       GET #1, , Yuk%                                                       
                                                                            
       'Ekrana piksel piksel yaz                                            
       FOR I = 0 TO Yuk% - 1                                                
           A$ = SPACE$(Gen%)                                                
           GET #1, 801 + I * Gen%, A$                                       
           FOR Y = 0 TO Gen% - 1                                            
                RegsX.Dx = I                                                
                RegsX.Ax = &HC00 + ASC(MID$(A$, Y + 1, 1))                  
                RegsX.Bx = 0                                                
                RegsX.Cx = Y                                                
                CALL InterruptX(&H10, RegsX, RegsX)                         
                IF INKEY$ <> "" GOTO Bitis                                  
                NEXT                                                        
       NEXT                                                                 
                                                                            
       'Resmin gsterimi bitti                                              
       PLAY "O2L8DP64"                                                      
       DO: LOOP UNTIL INKEY$ <> ""                                          
       Bitis:                                                               
       'Video modunu text yap                                               
       RegsX.Ax = 3                                                         
       CALL InterruptX(&H10, RegsX, RegsX)                                  
       '--------------------Progtam Sonu-------------------------           
  
        
        
        Rsm formatndaki bir resmin Bload formatna cevrilerek basic'de 
  gsterilmesine bir rnek;
  Ŀ
                                                                            
        '-------------------Program Balangc--------------------          
        '********* Versiyon 7.1 iin QBX /L QBX eklinde yklenmeli         
        '********* RSM formatnda resim gsterimi                           
        '********* Hz=Sper Hzl                                          
                                                                            
                                                                            
        '$INCLUDE: 'QBX.BI'                                                 
        DIM SHARED RegsX AS RegTypeX                                        
                                                                            
        'Okunacak Dosyay a                                                
        Dosya$ = "A0.RSM"                                                   
        OPEN Dosya$ FOR BINARY AS #1                                        
                                                                            
        'Bload yaplacak Dosyay a                                         
        Dos$ = "A0.DAT"                                                     
        OPEN Dos$ FOR BINARY AS #2                                          
                                                                            
        'Headeri koy                                                        
        FOR I = 1 TO 7: Y$ = Y$ + CHR$(0): NEXT                             
        MID$(Y$, 1, 1) = CHR$(&HFD)                                         
        MID$(Y$, 3, 1) = CHR$(&HA0)                                         
        MID$(Y$, 7, 1) = CHR$(&HFA)                                         
        PUT #2, , Y$                                                        
                                                                            
        'Video modunu ayarla                                                
        A$ = " ": GET #1, 4, A$                                             
        RegsX.Ax = ASC(A$)                                                  
        CALL InterruptX(&H10, RegsX, RegsX)                                 
                                                                            
        'Palet ve renk deerlerini yerine koy                               
        Renkler$ = SPACE$(800)                                              
        GET #1, 10, Renkler$                                                
        RegsX.Dx = SADD(Renkler$)                                           
        RegsX.Es = SSEG(Renkler$)                                           
        RegsX.Ax = &H1002                                                   
        CALL InterruptX(&H10, RegsX, RegsX)                                 
                                                                            
        'Renk Yazmalarn bilgilendir                                      
        RegsX.Dx = SADD(Renkler$) + 17                                      
        RegsX.Es = SSEG(Renkler$)                                           
        RegsX.Ax = &H1012                                                   
        RegsX.Bx = 0                                                        
        RegsX.Cx = &H100                                                    
        CALL InterruptX(&H10, RegsX, RegsX)                                 
                                                                            
        'Bload yaplacak dosyaya yaz                                        
        A$ = SPACE$(32000): GET #1, 801, A$: PUT #2, 8, A$                  
        A$ = SPACE$(32000): GET #1, 32801, A$: PUT #2, 32008, A$            
                                                                            
        'Resmi gster                                                       
        CLOSE #1                                                            
        CLOSE #2                                                            
        DEF SEG = &HA000                                                    
        BLOAD Dos$, 0   :'Bload kullanld iin son derece hzldr       
                                                                            
        'Resmin gsterimi bitti                                             
        KILL Dos$                                                           
        PLAY "O2L8DP64"                                                     
        DO: LOOP UNTIL INKEY$ <> ""                                         
                                                                            
        'Video modunu text yap                                              
        RegsX.Ax = 3                                                        
        CALL InterruptX(&H10, RegsX, RegsX)                                 
        '-------------------------Program Sonu---------------------         
  
        
       Rsm formatndaki bir resmin; gsterilmesi, Exe hale getirilmesi,
  kesilip biilmesi, kltlmesi, basic formatna dntrlmesi hallerine
  ayrntl rnekler RESIM.BAS isimli programda verilmitir.

         
>  GIF Resim Format :

  GIF resim format aadaki ekildedir:

         ilk 6 byte        "GIF87a"  iareti 
         2 byte            Resmin Genilii
         2 byte            Resmin Ykseklii
         1 byte            Resimde kullanlan Renk Says ve Palet Rengi
                           Renk Says=2^((ASCII deeri AND 7)+1)
                           Palet Rengi=(ASCII deeri and 128)=0
         1 byte            ArkaPlan rengi
         1 byte            0 olmak zorunda
         RenkSaysX3 byte Renk registerleri datalar
         1 byte            ASCII deeri 44 ise; uzatlm blok yok
                           ASCII deeri farkl ise bu bir GIF resim deil
                           ASCII deeri 33 ise; uzatlm blok var ve
                             a) sonraki iki byte anlamsz
                             b) bir byte oku bu byte'n ASCII deeri kadar
                                byte oku ASCII deeri 0 olana kadar bu ii
                                tekrarla
         2 byte            Resmin X giri noktas
         2 byte            Resmin Y giri noktas
         2 byte            Resmin X bykl
         2 byte            Resmin Y bykl
         ???? byte         Resme ait datalar

       GIF resim formatnda resme ait datalar sktrlm formdadr.
  Bu formatda bir resmin gsterilmesi ve basic formatna dntrlmesi iin 
  rnekler RESIM.BAS isimli programda verilmitir.

       Bu yaznn yeterli olduu kesinlikle sylenemez. Verilen bilgiler
  kesinlikle snanmakla beraber biraz eski yntemler olduunu kabul ediyorum. 
          
         Salcakla kaln....



