impersonalis |
27.07.2006 18:36 |
Скачка и загузка картинки
Картинка скачивается в память и на основе полученной информации создаётся image-объект Blitz-а. Без всяких свопов на винт (виндовые в расчёт не берём).
Код:
Graphics 640,480,32,2
SetBuffer BackBuffer()
Image = LoadBMPImage("http://mariusrabung.ma.funpic.de/Temp/TestImage.bmp")
DrawImage Image,0,0
Flip
WaitKey
EndGraphics
End
Function LoadBMPImage(Url$)
Local bfType%
Local bfSize%
Local bfReserved%
Local bfOffBits%
Local biSize%
Local biWidth%
Local biHeight%
Local biPlanes%
Local biBitCount%
Local biCompression%
Local biSizeImage%
Local biXPelsPerMeter%
Local biYPelsPerMeter%
Local biClrUsed%
Local biClrImportant%
Local biMaskRed%
Local biMaskGreen%
Local biMaskBlue%
Local biDown%
Local ClrTable%[256]
Local host$, host_tmp
host$=right(Url$,len(Url$)-7) ; http:// rausschneiden
host_tmp=instr(host$,"/")-1 ; Das erste Slash im String suchen und 1 abziehen
host$=left(host$,host_tmp) ; Den Text bis zu dem ersten Slash-1 k?rzen
Local stream=opentcpstream(host$,80)
WriteLine stream, "GET "+url$
WriteLine stream, "Host: "+host$
WriteLine stream, ""
;----------------------- Bitmap Header
bfType% = ReadShort(stream)
bfSize% = ReadInt(stream)
bfReserved% = ReadInt(stream)
bfOffBits% = ReadInt(stream)
;-----------------------
If bfType% <> 19778 Then RuntimeError("Error: File ist not a valid Windows Bitmap(.bmp)")
;----------------------- Bitmap InfoHeader
biSize% = ReadInt(stream)
biWidth% = ReadInt(stream)
biHeight% = ReadInt(stream)
biPlanes% = ReadShort(stream)
biBitCount% = ReadShort(stream)
biCompression% = ReadInt(stream)
biSizeImage% = ReadInt(stream)
biXPelsPerMeter% = ReadInt(stream)
biYPelsPerMeter% = ReadInt(stream)
biClrUsed% = ReadInt(stream)
biClrImportant% = ReadInt(stream)
If biHeight%>0 Then biDown%=0
If biHeight%<0 Then biDown%=1
;---------------------- evt. Farbmasken
If biCompression%=3 Then
biMaskBlue% = ReadInt(stream)
biMaskGreen% = ReadInt(stream)
biMaskBlue% = ReadInt(stream)
EndIf
;---------------------- FarbTabellen
If biClrUsed%=0 Then
If biBitCount%=1 Or biBitCount%=4 Or biBitCount%=8 Then
For tmp=0 To 2^biBitCount%
ClrTable[tmp] = ReadInt(stream);Byte(stream)+ReadByte(stream)+ReadByte(stream)+ReadByte(stream)
Next
EndIf
EndIf
;---------------------- BildDaten
Local img=CreateImage( biWidth%,biHeight% )
SetBuffer ImageBuffer(img)
;Print clrtable[0]
;Print clrtable[1]
;Print clrtable[2]
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print ReadByte(stream)
;Print biCompression%
;Print biBitCount%
;Print biDown%
;Print biHeight%
;Print biclrUsed%
;Print biclrimportant%
If biCompression%=0 Then ; BI-RGB
If biBitCount% = 1 Then
If biDown% = 0 Then
For tmp2=biHeight% To 0 Step -1
For tmp=0 To biWidth% ;Step -1
pixel=readbyte(stream)
LockBuffer ImageBuffer(img)
If pixel<>0 Then WritePixelFast tmp,tmp2,$FFFFFF
If pixel=0 Then WritePixelFast tmp,tmp2,$000000
UnlockBuffer ImageBuffer(img)
Next
Next
ElseIf biDown%=1 Then
For tmp2=0 To biHeight%
For tmp=0 To biWidth%
pixel=readbyte(stream)
LockBuffer ImageBuffer(img)
If pixel<>0 Then WritePixelFast tmp,tmp2,$FFFFFF
If pixel=0 Then WritePixelFast tmp,tmp2,$000000
UnlockBuffer ImageBuffer(img)
Next
Next
EndIf
ElseIf biBitCount% = 4
ElseIf biBitCount% = 8
ElseIf biBitCount% = 16
ElseIf biBitCount% = 24 Then
If biDown% = 0 Then
For tmp2=biHeight% To 0 Step -1
For tmp=0 To biWidth%
blue=ReadByte(stream)
green=ReadByte(stream)
red=Readbyte(stream)
;Color red,green,blue
LockBuffer ImageBuffer(img)
rgb=255*$1000000 + red*$10000 + green*$100 + blue
WritePixelFast tmp,tmp2,rgb
UnlockBuffer ImageBuffer(img)
;Plot tmp,tmp2
Next
Next
ElseIf biDown%=1 Then
For tmp2=0 To biHeight%
For tmp=0 To biWidth%
blue=ReadByte(stream)
green=ReadByte(stream)
red=Readbyte(stream)
;Color red,green,blue
LockBuffer ImageBuffer(img)
rgb=255*$1000000 + red*$10000 + green*$100 + blue
WritePixelFast tmp,tmp2,rgb
UnlockBuffer ImageBuffer(img)
;Plot tmp,tmp2
Next
Next
EndIf
ElseIf BiBitCount% = 32
Endif
ElseIf biCompression%=1 ; BI-RLE8
ElseIf biCompression%=2 ; BI-RLE4
ElseIf biCompression%=3 ; BI-BITFIELD
EndIf
SetBuffer BackBuffer()
Return img
CloseTCPStream stream
End Function
Код взят от сюда:
http://www.freecoder.chat-blitz.de/
|