Hi, tengo un problema, que me voló la cabeza seguro que es una boludes mas grande que una casa pero se me quemaron las neuronas, es medio complicado explicarlo pero voy a intentarlo.
supongamos una imagen, esta tiene unas dimensiones de 16 x 16px por cada pixel de esa imagen tenemos 3 bytes esto da como resultado un array de 768 bytes
16 x 16 x 3 = 768
otro ejemplo
32 * 16 * 3 = 1536
bien haciendo esa ecuación puedo saber la cantidad de bytes que ocupara la imagen, ahora supongamos que yo quiero ingresar la cantidad de bytes y deseo que la imagen sea lo mas cuadrada posible que ecuación tengo que hacer???
yo puedo poner (tomando el primer ejemplo)
Ancho = Sqr(768 / 3)
Alto = Ancho
pero que pasa si el array que ingreso es de 769 bytes tengo un resultado erróneo de 16,0104.. y esto no es una medida valida para una imagen ya que no puede tener decimales.
entonces puede que tenga que adicionar uno/s bytes extra al array para que sea un valor "par" así poder obtener un resultado correcto, no importa que sea una imagen 100% cuadrada, pero que sea lo mas aproximado.
Se entiende??, Gracias
Wenas LeandroA,
Bueno, no se si entendí, eso se verá en mi respuesta :P
Dim TmBytes As Long, WH As Long, Porct As Integer
' -> (17*17) * 3 -> 867 Bytes
TmBytes = 900
' -> WH=Width And Height
WH = Sqr(Round(TmBytes / 3, 0))
' -> Porcentaje
Porct = ((WH * WH * 3) * 100) / TmBytes
' -> Show..
MsgBox Porct & "% al original"
No se si ha eso te referías,
Para redondear, usa Round, luego saca un porcentaje.
SaluDOS!!!
hola, no noes eso, pero de todas formas estoy confundido en algo creo que estoy malinterpretando algo
lo que descrivi anteriormente no es tan asi, creo que es mejor cerrar la pregunta hasta tener en claro las cosas.
una imagen de 24 * 24 tiene 1728 (24 x 24 x 3 = 1728)
pero una imagen de 25 * 25 tiene 1900 (25 x 25 x 3 = 1875)
esto no cumple la regla que pensaba
alto x ancho x 3
las imagenes tienen una profundidad de bits de 24 osea un savepicture de vb
Option Explicit
Private Type BITMAPFILEHEADER '14 bytes
bfType As Integer '"magic cookie" - must be "BM"
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
Private Type BITMAPINFOHEADER '40 bytes
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Dim BFH As BITMAPFILEHEADER
Dim BIH As BITMAPINFOHEADER
Private Sub Form_Load()
Me.ScaleMode = vbPixels
Picture1.BorderStyle = 0
Picture1.BackColor = vbWhite
Picture1.Width = 24
Picture1.Height = 24
DoEvents
SavePicture Picture1.Image, App.Path & "\Image1.bmp"
LoadHeaderPicture App.Path & "\Image1.bmp"
Debug.Print BIH.biSizeImage
Picture1.Width = 25
Picture1.Height = 25
DoEvents
SavePicture Picture1.Image, App.Path & "\Image1.bmp"
LoadHeaderPicture App.Path & "\Image1.bmp"
Debug.Print BIH.biSizeImage
End Sub
Private Sub LoadHeaderPicture(ByVal sPath As String)
Open sPath For Binary Access Read As #1
Get #1, , BFH
Get #1, Len(BFH) + 1, BIH
Close #1
End Sub
a estudiar el formato bmp Fundamental :huh:
.
Haber si entendi quieres que sea lo mas cuadro posible aun que sea Ancho = X y Alto = X+1 o en el mejor de los casos Ancho = X y Alto = X PERO SIEMPRE SIN PUNTOS DESIMALES?... es esto?... si es asi, solo es una ecuación de equivalencia... y he aqui dicho problema...
Dulces Lunas!¡.
A ver, yo visual basic se poco, pero podrías a:
Ancho = Sqr(768/3)
Alto = Ancho
Transformar el resultado de Sqr(768/3) a Int o Integer, no se cómo se dirá (como se haga en VB), de manera que así pierdes los decimales y redondea. Después, haces:
int Tamaño = (768/3)//y le haceis una conversión explícita a int
Ancho = Sqr(Tamaño)//Se le vuelve a hacer una conversión
Alto = Tamaño - Ancho
HINT: El número que ingreses tiene que ser múltiplo de 3...
Cita de: [D4N93R] en 22 Octubre 2010, 14:00 PM
HINT: El número que ingreses tiene que ser múltiplo de 3...
Pero eso no quiere decir que ese número tenga una raíz cuadrada exacta.
Ahm, no pero es un paso hacia adelante! :P
Puedes probar con aspect ratios, es decir algo como 3:4. 1:1, 4:5 lo más cuadrado que puedas intentando varias posibilidades.
Cita de: LeandroA en 22 Octubre 2010, 07:53 AM
hola, no noes eso, pero de todas formas estoy confundido en algo creo que estoy malinterpretando algo
lo que descrivi anteriormente no es tan asi, creo que es mejor cerrar la pregunta hasta tener en claro las cosas.
una imagen de 24 * 24 tiene 1728 (24 x 24 x 3 = 1728)
pero una imagen de 25 * 25 tiene 1900 (25 x 25 x 3 = 1875)
esto no cumple la regla que pensaba
alto x ancho x 3
las imagenes tienen una profundidad de bits de 24 osea un savepicture de vb
Esto es porque el formato BMP tiene algunas otras cosas ademas de la picture, como las cabeceras y espacios al pedo.
Lo recuerdo de aca: Riemers DirectX Tutorial (http://www.riemers.net/eng/Tutorials/DirectX/Csharp/Series1/tut10.php)