Publié : lun. 02/juin/2008 19:28
Tu devrais mieux étudier la structure bitmap; tu ne prends pas en compte ses spécificités.
Forums PureBasic - Français
https://www.purebasic.fr/french/
Alors du coup, évidemment que ça marche toujours avec 32 bits, puisque ça fait exactement 4 octets par pixel. Avec 24 bits (3 octets), selon le nombre de pixels, il faut compléter la taille de la ligne pour que ce soit un multiple de 4.Chaque ligne de l'image doit comporter un nombre total d'octets qui soit un multiple de 4; si ce n'est pas le cas, la ligne doit être complétée par des 0 de telle manière à respecter ce critère.
Code : Tout sélectionner
Procedure.l ReverseRGB(Color.l)
ProcedureReturn RGB(Blue(Color),Green(Color),Red(Color))
EndProcedure
Procedure.l PointMemory(Image.l,X.l,Y.l)
Protected bmp.BITMAP,Color.l,Width.l,Height.l,Depth.b,Offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
ProcedureReturn -1
EndIf
;Décalage, bits nuls à droite
Offset=Width*Depth-Width*Depth/4*4
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp) : *Address=bmp\bmBits
;Récupération de la couleur du point
If *Address
CopyMemory(*Address+X*Depth+Y*Depth*(Width+Offset),@Color,Depth)
EndIf
;Attention à bien inverser les conventions BGR et RGB
ProcedureReturn ReverseRGB(Color)
EndProcedure
Procedure.b PlotMemory(Image.l,X.l,Y.l,Color.l)
Protected bmp.BITMAP,Width.l,Height.l,Depth.b,Offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
;Echec de l'opération
ProcedureReturn #False
EndIf
;Décalage, bits nuls à droite
Offset=Width*Depth-Width*Depth/4*4
Debug Offset
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp) : *Address=bmp\bmBits
;Inversion de la convention RGB et BGR
Color=ReverseRGB(Color)
;Collage du point dans l'image
If *Address
CopyMemory(@Color,*Address+X*Depth+Y*Depth*(Width+Offset),Depth)
EndIf
;Réussite de l'opération
ProcedureReturn #True
EndProcedure
CreateImage(0,295,189,24)
CreateImage(1,295,189,24)
ResizeImage(1,590,398,#PB_Image_Raw)
PlotMemory(0,10,10,$FFFFFF)
PlotMemory(1,10,10,$FFFFFF)
SaveImage(0,"image1.bmp")
SaveImage(1,"image2.bmp")
Code : Tout sélectionner
*Address+X*Depth+Y*Depth*Width
Code : Tout sélectionner
*Address+X*Depth+Y*Depth*(Width+Offset)
Code : Tout sélectionner
Offset=Width*Depth-Width*Depth/4*4
Code : Tout sélectionner
; le CERCLE
; exemple de cercle
; bouge = bouge + 1
; PSet (6000 * Cos(bouge) + (Screen.Width / 2), 6000 * Sin(bouge) + (Screen.Height / 2))
; angle en degré = 180 * (angle en radian) / pi
; ;Plot(WindowMouseX(), WindowMouseY(), RGB(255,255,255))
; ;sin*compt*phase/nmbr de point *amplitude
;Plot (60 * Cos(bouge) + (512 / 2), 60 * Sin(bouge) + (512 / 2),RGB(2,0,255))
Declare rapide_Point(x,y)
Declare rapide_Plot(x,y,color)
#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, EcranX, EcranY, "hello", #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
WindowID = WindowID(1)
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
Resultat = InitMouse()
Repeat
ExamineMouse()
Event=WaitWindowEvent()
StartDrawing( ScreenOutput())
compt+1
y= Sin(180*(compt*1/10000)/#PI) * (768 / 4) +768 / 2
x= Cos(180*(compt*1/10000)/#PI) * (1024 / 4)+1024 / 2
rapide_Plot(x,Y,RGB(0,255,0)) ; Procedure de Remplacement
;Plot(x, y,RGB(255,255,255)) ; plot ordinaire :o)
StopDrawing()
FlipBuffers():; affiche l'ecran
; ClearScreen(0, 0, 0) :;efface l'ecran
event=WindowEvent()
;}
If MouseButton(2)
End
EndIf
Until event=#PB_Event_CloseWindow
Procedure rapide_Point(x,Y)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits:PF=2
color = PeekW( DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_RGB : PF=4
color= PeekL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_BGR : PF=4
color= PeekL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
EndSelect
ProcedureReturn color
EndProcedure
Procedure rapide_Plot(x,Y,color)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits :PF=2
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
color=color>>2
PokeW( DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) , color )
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
PokeL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,color )
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
PokeL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,color )
EndSelect
EndProcedure
Code : Tout sélectionner
Procedure.l ReverseRGB(Color.l)
ProcedureReturn RGB(Blue(Color),Green(Color),Red(Color))
EndProcedure
Procedure.l PointMemory(Image.l,X.l,Y.l)
Protected bmp.BITMAP,Color.l,Width.l,Height.l,Depth.b,Offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
ProcedureReturn -1
EndIf
;Décalage, bits nuls à droite
Offset=Width*3-Width*3/4*4
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp) : *Address=bmp\bmBits
;Récupération de la couleur du point
If *Address
CopyMemory(*Address+X*Depth+Y*Depth*(Width+Offset),@Color,Depth)
EndIf
;Attention à bien inverser les conventions BGR et RGB
ProcedureReturn ReverseRGB(Color)
EndProcedure
Procedure.b PlotMemory(Image.l,X.l,Y.l,Color.l)
Protected bmp.BITMAP,Width.l,Height.l,Depth.b,Offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
;Echec de l'opération
ProcedureReturn #False
EndIf
;Décalage, bits nuls à droite
Offset=Width*Depth-Width*Depth/4*4
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp) : *Address=bmp\bmBits
;Inversion de la convention RGB et BGR
Color=ReverseRGB(Color)
;Collage du point dans l'image
If *Address
CopyMemory(@Color,*Address+X*Depth+Y*Depth*(Width+Offset),Depth)
EndIf
;Réussite de l'opération
ProcedureReturn #True
EndProcedure
Procedure rapide_Point(x,Y)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
Case #PB_PixelFormat_24Bits_RGB : PF=3:t=0
Case #PB_PixelFormat_24Bits_BGR : PF=3:t=1
Case #PB_PixelFormat_15Bits : PF=2:t=0 ; 2 octets par pixel
Case #PB_PixelFormat_16Bits : PF=2:t=0
Case #PB_PixelFormat_8Bits: PF=1
EndSelect
color= PeekL(DrawingBuffer() + (x * PF) +DrawingBufferPitch()* ( Y ) )
If t=1
Rouge=Red(color)
Vert=Green(color)
Bleu=Blue(color)
color=RGB(Bleu,Vert,Rouge)
EndIf
ProcedureReturn color
EndProcedure
Procedure rapide_Plot(x,Y,color)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
Case #PB_PixelFormat_24Bits_RGB : PF=3:t=0
Case #PB_PixelFormat_24Bits_BGR : PF=3:t=1
Case #PB_PixelFormat_15Bits : PF=2:t=0 ; 2 octets par pixel
Case #PB_PixelFormat_16Bits : PF=2:t=0
Case #PB_PixelFormat_8Bits: PF=1
EndSelect
If t=1
Rouge=Red(color)
Vert=Green(color)
Bleu=Blue(color)
color=RGB(Bleu,Vert,Rouge)
EndIf
PokeL(DrawingBuffer() + (x * PF) +DrawingBufferPitch()* ( Y ) ,color )
EndProcedure
CreateImage(0,295,189,32)
CreateImage(1,295,189,32)
ResizeImage(1,590,398,#PB_Image_Raw)
PlotMemory(0,10,10,$FFFFFF)
Time.l=ElapsedMilliseconds()
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
PlotMemory(1,X,Y,$FFFFFF)
Next Y
Next X
Time=ElapsedMilliseconds()-Time
Debug Time
CreateImage(1,295,189,32)
ResizeImage(1,590,398,#PB_Image_Raw)
Time=ElapsedMilliseconds()
StartDrawing(ImageOutput(1))
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing()
Time=ElapsedMilliseconds()-Time
Debug Time
CreateImage(1,295,189,32)
ResizeImage(1,590,398,#PB_Image_Raw)
Time=ElapsedMilliseconds()
StartDrawing(ImageOutput(1))
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
rapide_Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing()
Time=ElapsedMilliseconds()-Time
Debug Time
SaveImage(0,"image1.bmp")
SaveImage(1,"image2.bmp")
Code : Tout sélectionner
bmp\bmWidth
bmp\bmHeight
Pardon je ne t'ai pas donné la derniere version du CodeOctavius a écrit : Malheureusement tes fonctions ne fonctionnent pas chez moi, il me dit que l'adresse mémoire est invalide. Voici mon code :
Code : Tout sélectionner
Procedure.l ReverseRGB(Color.l)
ProcedureReturn RGB(Blue(Color),Green(Color),Red(Color))
EndProcedure
Procedure.l PointMemory(Image.l,X.l,Y.l)
Protected bmp.BITMAP,Color.l,Width.l,Height.l,Depth.b,Offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
ProcedureReturn -1
EndIf
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp)
;Adresse de l'image
*Address=bmp\bmBits
;Longueur en octets d'une ligne
Offset=bmp\bmWidthBytes
;Récupération de la couleur du point
If *Address
CopyMemory(*Address+X*Depth+Y*Offset,@Color,Depth)
EndIf
;Attention à bien inverser les conventions BGR et RGB
ProcedureReturn ReverseRGB(Color)
EndProcedure
Procedure.b PlotMemory(Image.l,X.l,Y.l,Color.l)
Protected bmp.BITMAP,Width.l,Height.l,Depth.b,Offset.l,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
;Echec de l'opération
ProcedureReturn #False
EndIf
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp)
;Adresse de l'image
*Address=bmp\bmBits
;Longueur en octets d'une ligne
Offset=bmp\bmWidthBytes
;Inversion de la convention RGB et BGR
Color=ReverseRGB(Color)
;Collage du point dans l'image
If *Address
CopyMemory(@Color,*Address+X*Depth+Y*Offset,Depth)
EndIf
;Réussite de l'opération
ProcedureReturn #True
EndProcedure
Procedure rapide_Point(x,Y)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits:PF=2
color = PeekW( DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_RGB : PF=4
color= PeekL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_BGR : PF=4
color= PeekL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
EndSelect
ProcedureReturn color
EndProcedure
Procedure rapide_Plot(x,Y,color)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits :PF=2
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
color=color>>2
PokeW( DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) , color )
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
PokeL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,color )
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
PokeL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,color )
EndSelect
EndProcedure
; CreateImage(0,295,189,24)
; CreateImage(1,295,189,24)
; ResizeImage(1,590,398,#PB_Image_Raw)
;
; PlotMemory(0,10,10,$FFFFFF)
; PlotMemory(1,10,10,$FFFFFF)
;
; SaveImage(0,"image1.bmp")
; SaveImage(1,"image2.bmp")
CreateImage(1,295,189,32)
ResizeImage(1,590,398,#PB_Image_Raw)
Time.l=ElapsedMilliseconds()
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
PlotMemory(1,X,Y,$FFFFFF)
Next Y
Next X
Time=ElapsedMilliseconds()-Time
Debug Time
;*********************************************
CreateImage(1,295,189,32)
ResizeImage(1,590,398,#PB_Image_Raw)
Time=ElapsedMilliseconds()
StartDrawing(ImageOutput(1))
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing()
Time=ElapsedMilliseconds()-Time
Debug Time
;*********************************************
CreateImage(1,295,189,32)
ResizeImage(1,590,398,#PB_Image_Raw)
Time=ElapsedMilliseconds()
StartDrawing(ImageOutput(1))
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
rapide_Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing()
Time=ElapsedMilliseconds()-Time
Debug Time
Code : Tout sélectionner
Procedure.l ReverseRGB(Color.l)
ProcedureReturn RGB(Blue(Color),Green(Color),Red(Color))
EndProcedure
Procedure.l PointMemory(Image.l,X.l,Y.l)
Protected bmp.BITMAP,Color.l,Width.l,Height.l,Depth.b,Offset.b,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
ProcedureReturn -1
EndIf
;Adresse de l'image
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp)
;Adresse de l'image
*Address=bmp\bmBits
;Longueur en octets d'une ligne
Offset=bmp\bmWidthBytes
;Récupération de la couleur du point
If *Address
CopyMemory(*Address+X*Depth+Y*Offset,@Color,Depth)
EndIf
;Attention à bien inverser les conventions BGR et RGB
ProcedureReturn ReverseRGB(Color)
EndProcedure
Procedure.b PlotMemory(Image.l,X.l,Y.l,Color.l)
Protected bmp.BITMAP,Width.l,Height.l,Depth.b,Offset.l,*Address
;On initialise la taille de l'image
Width=ImageWidth(Image)
Height=ImageHeight(Image)
Depth=ImageDepth(Image)/8
;On vérifie les coordonnées
If X<0 Or X>Width-1 Or Y<0 Or Y>Height-1
;Echec de l'opération
ProcedureReturn #False
EndIf
GetObject_(ImageID(Image),SizeOf(BITMAP),@bmp)
;Adresse de l'image
*Address=bmp\bmBits
;Longueur en octets d'une ligne
Offset=bmp\bmWidthBytes
;Inversion de la convention RGB et BGR
Color=ReverseRGB(Color)
;Collage du point dans l'image
If *Address
CopyMemory(@Color,*Address+X*Depth+Y*Offset,Depth)
EndIf
;Réussite de l'opération
ProcedureReturn #True
EndProcedure
Procedure rapide_Point(x,Y)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits:PF=2
color = PeekW( DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_RGB : PF=4
color= PeekL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
Case #PB_PixelFormat_32Bits_BGR : PF=4
color= PeekL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y*PF ) )
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
EndSelect
ProcedureReturn color
EndProcedure
Procedure rapide_Plot(x,Y,color)
; AdresseVideo = Buffer + ( x * PF ) + (BufferP/PF) * (y * PF)
Select DrawingBufferPixelFormat()
Case #PB_PixelFormat_16Bits :PF=2
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
color=color>>2
PokeW( DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) , color )
Case #PB_PixelFormat_32Bits_RGB : PF=4:t=0
PokeL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,color )
Case #PB_PixelFormat_32Bits_BGR : PF=4:t=1
rouge=Red(color)
vert=Green(color)
bleu=Blue(color)
color=RGB(bleu,vert,rouge)
PokeL(DrawingBuffer() + (x * PF) +(DrawingBufferPitch()/PF)* ( Y *PF) ,color )
EndSelect
EndProcedure
; CreateImage(0,295,189,24)
; CreateImage(1,295,189,24)
; ResizeImage(1,590,398,#PB_Image_Raw)
;
; PlotMemory(0,10,10,$FFFFFF)
; PlotMemory(1,10,10,$FFFFFF)
;
; SaveImage(0,"image1.bmp")
; SaveImage(1,"image2.bmp")
CreateImage(1,512,512,24)
ResizeImage(1,1024,1024,#PB_Image_Raw)
Time.l=GetTickCount_()
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
Next Y
Next X
Time=GetTickCount_()-Time
MessageRequester("Témoin sans plot",Str(Time)+" ms")
;*********************************************
CreateImage(1,512,512,24)
ResizeImage(1,1024,1024,#PB_Image_Raw)
Time.l=GetTickCount_()
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
PlotMemory(1,X,Y,$FFFFFF)
Next Y
Next X
Time=GetTickCount_()-Time
MessageRequester("Ma fonction perso PlotMemory()",Str(Time)+" ms")
;*********************************************
CreateImage(1,512,512,24)
ResizeImage(1,1024,1024,#PB_Image_Raw)
Time=GetTickCount_()
StartDrawing(ImageOutput(1))
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing()
Time=GetTickCount_()-Time
MessageRequester("La fonction native Plot()",Str(Time)+" ms")
;*********************************************
CreateImage(1,512,512,24)
ResizeImage(1,1024,1024,#PB_Image_Raw)
Time=GetTickCount_()
StartDrawing(ImageOutput(1))
For X=0 To ImageWidth(1)
For Y=0 To ImageHeight(1)
rapide_Plot(X,Y,$FFFFFF)
Next Y
Next X
StopDrawing()
Time=GetTickCount_()-Time
MessageRequester("La fonction de Dobro & Cpl.Bator rapide_Plot()",Str(Time)+" ms")
Code : Tout sélectionner
CreateImage(1,512,512,24)