Hi,
hab mal ein so ein gepunktetes Bild gesehen und mich dazu entschlossen einen Algo zu schreiben der das auch mit einem normalen Bild macht und ich poste hier, was rausgekommen ist. Zum probieren einfach oben ein vorhandenes Bild angeben. Das beste Resultat sieht man dann in der durch das Progg erstellten Datei names BigTest.bmp.
Durch Oval is der Algo nat. nicht sonderlich schnell, aber er ist ja auch nicht für RealTime gedacht
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] Const imagename$ = "face.jpg"
Graphics 1024, 768, 32, 1
image = LoadImage(imagename$) MaskImage image, 255, 255, 0
image2 = CopyImage(image) MaskImage image2, 255, 255, 0
BlackImage(image2)
image3 = CopyImage(image2) MaskImage image3, 255, 255, 0
AbgleicheImage(image3)
image4 = DotImg(image3, 5) MaskImage image4, 255, 255, 0
image5 = ScaleDotImage(image3, 5) SaveImage(image5, "BigTest.bmp")
SetBuffer BackBuffer()
ClsColor 0, 0, 255
w = ImageWidth(image) h = ImageHeight(image)
Repeat Cls DrawImage image, 0, 0 DrawImage image2, w, 0 DrawImage image3, 0, h DrawImage image4, w, h Flip Until KeyDown(1) End
Function AbgleicheImage(img) low = 255 high = 0 SetBuffer ImageBuffer(img) LockBuffer w = ImageWidth(img)-1 h = ImageHeight(img)-1 For i=0 To w For j=0 To h b = ReadPixelFast(i, j) And $FF If b < low Then low = b If b > high Then high = b Next Next high = high - low If high = 0 Then Return 0 For i=0 To w For j=0 To h b = (ReadPixelFast(i, j) And $FF) - low b = (b/Float(high)) * 255.0 WritePixelFast i, j, $FF000000 Or b Or (b Shl 8) Or (b Shl 16) Next Next UnlockBuffer End Function
Function DotImg(img, ds, r=255, g=0, b=0, br=0, bg=0, bb=0) w = ImageWidth(img) h = ImageHeight(img) ds = ds-1 mx = Ceil(Float(w)/Float(ds)) my = Ceil(Float(h)/Float(ds)) rds = Ceil(Sqr(((ds/2.0)*(ds/2.0))*2.0)) fb = CreateImage(w, h) LockBuffer(ImageBuffer(img)) SetBuffer ImageBuffer(fb) Color r, g, b ClsColor br, bg, bb Cls For i=0 To mx For j=0 To my v = 0 For x = 0 To ds For y = 0 To ds v = v + (ReadPixelFast(ds*i+x, ds*j+y, ImageBuffer(img)) And $FF) Next Next v = v/((ds*ds)) v = v*(rds/255.0) Oval i*ds + (ds/2) - v, j*ds + (ds/2) - v, 2*v, 2*v Next Next UnlockBuffer ImageBuffer(img) Return fb End Function
Function BlackImage(img) width = ImageWidth(img)-1 height = ImageHeight(img)-1 SetBuffer ImageBuffer(img) LockBuffer For i=0 To width For j=0 To height r = ReadPixelFast(i, j) g = (r Shr 8) And $FF b = r And $FF r = (r Shr 16) And $FF r = (r+g+b)/3 r = $FF000000 Or (r Shl 16) Or (r Shl 8) Or r WritePixelFast i, j, r Next Next UnlockBuffer End Function
Function ScaleDotImage(img, ds, r=255, g=0, b=0, br=0, bg=0, bb=0) w = ImageWidth(img)-1 h = ImageHeight(img)-1 fb = CreateImage((w+1)*ds, (h+1)*ds) rds = Ceil(Sqr(((ds/2.0)*(ds/2.0))*2.0)) LockBuffer(ImageBuffer(img)) SetBuffer ImageBuffer(fb) Color r, g, b ClsColor br, bg, bb Cls For i=0 To w For j=0 To h v = ReadPixelFast(i, j, ImageBuffer(img)) And $FF v = v*(rds/255.0) Oval i*ds + (ds/2) - v, j*ds + (ds/2) - v, 2*v, 2*v Next Next UnlockBuffer ImageBuffer(img) Return fb End Function
Mfg Xenon
|