Bu sayfadaki yazılar
Sayfanın metni
Sayfa 81
WEND p BodyLength=CVL(INPUT$(4,1)) LongsPerRow=(FIX(en/16-.001 )+1 )/2 IF Compression=0 THEN GOTO DatNormal Decrunch: PRINT "RESİM SIKISTRILIMIS" OPEN "RAM:TempData" FOR OUTPUT AS 2 WHILE Count < BodyLength Dat=ASC(INPUT$(1,1)): Count=Count+1 IF Dat>-1 AND Dat<128 THEN PRINT #2,INPUT$(Dat+1,1); Count=Count+Dat+1 END IF
IF Dat>128THEN Dat$=INPUT$(1,1): Count=Count+1 IF Dat$="" THEN Dat$=CHR$(0) Dat$=STRING$(256-Dat+1,Dat$) PRINT #2,Dat$; END IF
'Program "Amir.r.Amlr" DECLARE FUNCTION GetRGB4& LIBRARY LIBRARY ":bmaps graphics.library"
Input" DOSYA ADI";PlcName$ n Win& = WINDOW(7) Scrn&=PEEKL(Win&+46)
en=PEEKW(Scrn&+12) boy=PEEKW(Scrn&-»-14) BitMapAdr&=PEEKL(Scrn&+88) derin=PEEK(BitMapAdr&+5) ColorMap$=PEEKL(Scrn&+48) FOR l=0 TO derin-1
BitMap&(i)=PEEKL(BitMapAdr&+8+i*4) NEXT i
OPEN PicName$ FOR OUTPUT AS 1 PRINT #1,"FORM"; Uz&=48+2Aderin*3+en*boy*derin/8 PRINT #1,MKL$(uz&); PRINT #1,"ILBM";"BMHD"; PRINT #1,MKL$(20); PRINT #1 ,MKI$(en);MKI$(boy); PRINT #1 ,MKL$(0);CHR$(derin); PRINT #1 ,CHR$(0);MKI$(0);MKI$(0); PRINT #1,CHR$(10);CHR$(11); IF en>350 THEN PWidth=640 ELSE PWidth=320
WEND q CLOSE OPEN "RAM:TempData" FOR INPUT AS 1 DatNormal:
FOR y=0 TO boy-1
FOR z=0 TO Derin-1
FOR x=1 TO LongsPerRow bnb POKEL BitMap&(z)+Count(z),CVL(INPUT$(4,1))
Count(z)=Count(z)+4 NEXT x NEXT z NEXT y
END:
CLOSE IF Compression=1 THEN KILL "RAM:TempData" END
IF boy>350 THEN PHeight=512 ELSE PHeight=256 PRINT #1 ,MKI$(PWIdth);MKI$(PHeight); PRINT #1,"CMAP"; o PRINT #1,MKL$(2*derin*3); FOR FNr%=0 TO (2Aderin-1)
Wt%=GetRGB4& (ColorMap&,FNr%)
PRINT #1 ,CHR$((Wt% AND 3840)/16); PRINT #1,CHR$(Wt% AND 240); PRINT #1,CHR$((Wt% AND 15)*16); NEXT FNr%
PRINT #1 ."BODY"; PRINT #1,MKL$(boy*en*derln/8); LongsPerRow=(FIX(en/16-.001 )+1 )/2 FOR y=0 TO boy-1 FOR z=0 TO derin-1 FOR x=1 TO LongsPerRow Wt&=PEEKL (BitMap&(z)+Count(z)) PRINT #1,MKL$(Wt&); Count(z)=Count(z)+4 NEXT x NEXT z NEXT y CLOSE 1 PRINT" Dosya kaydedildi!!!!"; END
Maalesef burada yine Library fonksiyonlarına işimiz düşüyor. Hepinize kolay gelsin.
Programı yazarken verilen numaralara bağlı kalarak yazmalısınız. Yani 1 numaralı bölümden başlayacaksınız, 2, 3 şeklinde alt alta yazacaksınız.
Yukarıda bulunan program ismini ve DOS adresini girebileceğiniz herhangi bir 32'ye kadar renge sahip olan resmi yükleyebilir. Basic'in keleğinden 256 satırlık resimleri yükleyemiyor. (Hani haberiniz ola!!!).
Hemen sizi uyaralım, program, özellikle sıkıştırılmış resimleri açarken çok zaman geçecektir. Program bu yüzden çok kullanışlı sayılamaz. Programcılar kısa sürede bunun farkına vardılar ve Amiga Basic'ten hızlı yüklenebilen bir dosya geliştirdiler bu dosya türüne ACBM dosyaları adı verilmektedir. İşin kötü yanı IFF resimleri kullanabilmek için önce bu resimleri ACBM formatına çevirmek gerekir. Bu çevrim işini yapabilmenin temel şartı resmi yükleyebilmek. Ancak bir kere ACBM'e çevrilmiş bir resmi artık hızlandırılmış olarak yükleyebilir ve kaydedebilirsiniz. Deluxe Paint gibi bir program da bu ACBM'leri yükleyemeyeceğinden yine çevrimlere ihtiyaç duyulacaktır.
Sorunlarına rağmen bu dosyayı kullanmak istiyorsanız, örnek bir programı bilgisayarınızla birlikte gelen Workbench/Extras disketinin BasicDemos kısmında bulabilirsiniz.
Yükleme kısmını hallettik. Kayıt işine gelelim. Kaydederken, dosyanın ACBM veya IFF olması fazla bir hız farkı getirmez. Ayrıca sıkıştırma kısmını yazıp yazmamak sizin keyfinize kalmış. Herhangi bir program sırf sıkıştırılmamış diye sizin resimlerinizi yüklememezlik etmeyecektir. Bu yüzden yazacağınız bir kayıt programında sıkıştırma kısmına yer vermenize gerek kalmaz. Daha pratik bir çözüm ise ScreenX utility'sini kullanarak sağlanır. ScreenX bir ekranı IFF olarak kaydetmeye yarayan bir program (Amiga Dünyası Sayı 17, Sayfa 37).
Son örneğimiz resmi IFF olarak kaydediyor.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 80
Bu ay sizlere Electronic Arts tarafından geliştirilen IFF formatında kaydedilmiş resimleri Basic'ten yüklemek ve kaydetmek için gerekli olan bilgileri ve programcıkları sunmak istiyorum. Bilindiği üzere Amiga'nın çok gelişmiş bir resim standardı mevcut. Bu standardın en büyük rahatlığı, neredeyse her resim programında, diğer programlar tarafından geliştirilmiş resimleri görebilmeniz. Klasik bir Amiga kullanıcısı bu durumu olağan karşılayacaktır. Ancak başka bilgisayarlardan tecrübesi olanlar, Amiga'da bulunan standardın değerini bileceklerdir. IFF aralarında değiştirebilecekleri dosya tanımı anlamına gelen Interchangeable File Format'tan gelmektedir. (Nedense Türkiye'de ben dahil eski Amigacılardan çoğu bu kısaltmayı AY Fİ Fİ olarak okurken, daha yeniler hep doğru olan AY EF EF demekte). Söylemeden geçmeyelim IFF'in en büyük özelliklerinden birisi, sadece resim değil, yazı, animasyon, müzik ve örneklenmiş seslerin de aynı dosya formatında saklanabilmesine olanak sağlıyor. Bu esnekliği sağlayabilmek için ise bu formata kaydedilmiş dosyaların başında belirleyici bir bölüm bulunur. Bu bölüm her zaman FORM harfleriyle başlar. (Herhangi bir dosyanın IFF olup olmadığını anlayabilmek için ilk dört byte'ına bakmak yeter.). Bundan sonra gelen Long'da ise (Bir long= 2 word= 4 byte) dosyanın byte cinsinden uzunluğu bulunur. Üçüncü long ise dosyada bulunan verinin türünü belirler. Bu bölümlerin belli başlıları şunlardır:
ILBM Grafik dosyası SMUS Müzik dosyası FTXT Formatlı yazı dosyası 8SVX Örneklenmiş ses dosyası ANIM Animasyon dosyası Bizi bu aşamada sadece ILBM ilgilendiriyor. Bu bölümün arkasından (Her türe göre değişen) ve Chunk adı verilen alt bölümler geliyor. Resim saklanan ILBM ile tanımlanan dosyalarda bulunan chunkların bazıları ve içerdikleri bilgiler şunlardır:
BMHD Grafik genel özelliklerini taşır CMAP Renk paletini taşır CRNG Cycle özelliğine ilişkin bilgileri taşır BODY Resim datalarının kendisini taşır. Tüm bu ön bilgilerden sonra bir IFF resim dosyasının baş kısmına bir örnek verelim: Uzunluk İçerik (Mesela) Anlamı Uzunluk İçerik (Mesela) Anlamı LONG . "FORM" Bir IFF dosyası LONG "CMAP" Renkler buradan sonra gelecek LONG 40156 Dosyanın uzunluğu LONG 96 Bu bölümün uzunluğu LONG "ILBM" Bu bir Resim dosyası BYTE'lar 43,12,76,... Renk kodları (Örnekte 96 byte) LONG "BMHD" Grafiğe ilişkin genel bilgiler LONG "BODY" Asıl bölüm LONG 20 Bu bölümün uzunluğu (Byte olarak) LONG 40000 Bu bölümün uzunluğu BYTE'lar 20,34,45... Genel bilgiler (Örnekte 20 byte) BYTE'lar 65,22,87,.. Resim verileri Eğer bir IFF dosyası okuyacaksak ilk olarak bu baş kısmı anlayabilecek bir program yapmalıyız. Herhalde merak ettiğiniz konu resim ile ilgili bilgilerin neler olduğu ve nasıl okunacağıdır. BMHD kısmı şu şekilde oluşturulur: Uzunluk İsim Anlamı Uzunluk İsim Anlamı WORD Width Resmin genişliği BYTE Dummy Anlamsız WORD Height Resmin yüksekliği WORD TransColor 'Saydam' olan renk numarası(genelde 0) WORD Xpos Resmin ekranın sol kenarından uzaklığı BYTE Xaspect Genişliğin yüksekliğe oranı WORD Ypos Resmin ekranın üstünden uzaklığı BYTE Yaspect Yüksekliğin genişliğe oranı BYTE Depth Resmin derinliği (*) WORD PageWidth Ekran genişliği BYTE Masking Bitmap maskesinin dahil olup olmadığı WORD PageHeight Ekran yüksekliği BYTE Compr Dosya sıkışık mı ? (1= evet, 0 =hayır)
(*) Derinlik bir resmin kaç renkten oluşacağını belirler. Derinlik 1 ise 2, 2 ise 4, 3 ise 8, 4 ise 16 ve 5 ise 32 renkli grafikler söz konusudur. Burada derinlik olarak 6 bulunabilir. Bu ise özel resim modlarındandır. Library desteği olmaksızın Basic'te gerçekleştirilemezler (Bunlar Extra Half bright ve HAM modlarına ait).
BMHD'da bulunan bu sayıların hepsi bizim için ilginç değil. Ne var ki dosyanın sıkıştırılmış olup olmadığını gösteren kısmı çok önemli. Eğer resim sıkıştırılmamışsa resmi doğrudan okuyabiliriz ancak resim sıkıştırılmışsa resmi yazmadan önce eski haline getirmek olmalı. Dosyanın nasıl sıkıştırıldığını uzun uzun anlatmayacağım, sıkıştırılmamış dosyalarla çalışarak programınıza bu ekstraları eklemek zahmetinden kurtulabilirsiniz. Diğer sıkıştırılmış resimleri ise çeşitli utilityler ile (Mesela Pixmate) açabilirsiniz. (Power Packer gibi Cruncherları kullanmayın !!!!)
Sıkıştırma sistemi şu prensibe dayanıyor. Diyelim dosya şöyle bir şey olsun: 0,0,0,0,0,0,0,1,1,1,1,2,2,2........ gibi değerler yerine; 7,0,4,1,3,2,... yazılıyor . Bu yazış tarzı ile önce kaç adet daha sonra ise hangi veriden yazılacağı belirtiliyor..(Çok kabaca !!!) İşte şimdi size IFF formatında kaydedilmiş resimleri yükleyebilen bir program sunuyorum:
Program "Amir.r.Amir" n BAŞLAMA:
CLS DEFLNG a-z INPUT "RESİM: ",PlcName$
DOS YANIN BASI:
OPEN PicName$ FOR INPUT AS 1 bo$=INPUT$(12,1)
BMHD:
BMHD$=INPUT$(4,1) IF BMHD$<>"BMHD" THEN END bo$=INPUT$(4,1) en=CVI(INPUT$(2,1)) boy=CVI(INPUT$(2,1)) bo$=INPUT$(4,1) Derin=ASC(INPUT$(1,1)) bo$=INPUT$(1,1) Compression=ASC(INPUT$(1,1)) bo$=INPUT$(5,1) PWidth=CVI(INPUT$(2,1)) PHeight=CVI(INPUT$(2,1)) IF PWidth=320 THEN
IF PHeight>350 THEN Mode=3 ELSE Mode=1 ELSE
IF PHeight>350 THEN Mode=4 ELSE Mode=2 END IF
ScreenACALIM: o SCREEN 1,en,boy,Derin,Mode WINDOW 1„,0,1 RastPort&=WINDOW(8) BitMapStr&=PEEKL (RastPort&+4) FOR i=0 TO 4
BitMap&(i)-PEEKL(BitMapStr&+8+i*4) NEXT i
Color Read:
WHILE CMap$<>"CMAP"
CMap$=INPUT$(4,1) WEND bo$=INPUT$(4,1) FOR RenkNr=0 TO (2ADerin-1)
r#=(ASC(INPUT$(1,1 )))/256 g#=(ASC(INPUT$(1,1 )))/256 b#=(ASC(INPUT$(1,1 )))/256 PALETTE RenkNr,r#,g#,b# NEXT RenkNr
BodyRead:
WHILE bo$+dy$<>"BODY"
bo$=INPUT$(2,1) dy$=INPUT$(2,1) IFdyS^'BO-'THEN IF INPUT$(2,1)=,,DY" THEN bo$="BO" : dy$="DY" END IF