Problema Matematico

Iniciado por LeandroA, 22 Octubre 2010, 06:31 AM

0 Miembros y 1 Visitante están viendo este tema.

LeandroA

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

EddyW

Wenas LeandroA,

Bueno, no se si entendí, eso se verá en mi respuesta :P
Código (vb) [Seleccionar]
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!!!

LeandroA

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:

BlackZeroX

#3
.
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!¡.
The Dark Shadow is my passion.

KuraraGNU

#4
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

[D4N93R]

HINT: El número que ingreses tiene que ser múltiplo de 3...

KuraraGNU

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.

[D4N93R]

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.

raul338

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