fast convert rgb to grayscale

16/11/2010 - 23:02 por flyguille | Informe spam
fast grayscaling a big bitmap trucolor (like 12000y, 9600x pix) in vb6

I already googled a lot, take GDI+ tutorials, and everything. But I
don't want it in the slow way

So, I wondered if that well know VB code about making a colourmatrix
is possible to translate to work in VB5/6?

[CODE]
Dim dlg As OpenFileDialog = New OpenFileDialog()
dlg.Filter = "Image files (*.BMP, *.JPG, *.GIF)|*.bmp;*.jpg;*.gif"
If dlg.ShowDialog() = DialogResult.OK Then
Dim img As Image = Image.FromFile(dlg.FileName)
Dim bm As Bitmap = New Bitmap(img.Width, img.Height)
Dim g As Graphics = Graphics.FromImage(bm)
Dim cm As ColorMatrix = New ColorMatrix(New Single()() _
{New Single() {0.3, 0.3, 0.3, 0, 0}, _
New Single() {0.59, 0.59, 0.59, 0, 0}, _
New Single() {0.11, 0.11, 0.11, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}})


Dim ia As ImageAttributes = New ImageAttributes()
ia.SetColorMatrix(cm)
g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0,
0, img.Width, img.Height, GraphicsUnit.Pixel, ia)
g.Dispose()
Me.BackgroundImage = bm
End If

[/CODE]

strip out the img loading lines, i already have the image in a
StdPicture, maybe I can to setup a DC and selecting the bitmap of the
stdpicture but... how to implement that colorMatrix thing in VB6?

anybody has the routine already done? i don't want to reinvent the
whell.

Preguntas similare

Leer las respuestas

#1 Langosta
18/11/2010 - 15:59 | Informe spam
"flyguille" escribió en el mensaje de noticias
news:
fast grayscaling a big bitmap trucolor (like 12000y, 9600x pix) in vb6

I already googled a lot, take GDI+ tutorials, and everything. But I
don't want it in the slow way

So, I wondered if that well know VB code about making a colourmatrix
is possible to translate to work in VB5/6?

[CODE]
Dim dlg As OpenFileDialog = New OpenFileDialog()
dlg.Filter = "Image files (*.BMP, *.JPG, *.GIF)|*.bmp;*.jpg;*.gif"
If dlg.ShowDialog() = DialogResult.OK Then
Dim img As Image = Image.FromFile(dlg.FileName)
Dim bm As Bitmap = New Bitmap(img.Width, img.Height)
Dim g As Graphics = Graphics.FromImage(bm)
Dim cm As ColorMatrix = New ColorMatrix(New Single()() _
{New Single() {0.3, 0.3, 0.3, 0, 0}, _
New Single() {0.59, 0.59, 0.59, 0, 0}, _
New Single() {0.11, 0.11, 0.11, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}})


Dim ia As ImageAttributes = New ImageAttributes()
ia.SetColorMatrix(cm)
g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0,
0, img.Width, img.Height, GraphicsUnit.Pixel, ia)
g.Dispose()
Me.BackgroundImage = bm
End If

[/CODE]

strip out the img loading lines, i already have the image in a
StdPicture, maybe I can to setup a DC and selecting the bitmap of the
stdpicture but... how to implement that colorMatrix thing in VB6?

anybody has the routine already done? i don't want to reinvent the
whell.







Digamos que tu imagen es de 24 bits. Recuperas es array de bits
(GetDIBits) y recorres pixel a pixel haciendo el siguiente cálculo

byte_indice = byte_rojo * 0.3 + byte_verde * 0.59 + byte_azul * 0.11

esa es la operación representada en la matriz.

una imagen en escala de grises, es un bitmap indexado de 8 bits

la primer entrada en la paleta es 0, 0, 0, 0
la segunda 1, 1, 1, 0
la última 255, 255, 255, 0

Todo bien.
Respuesta Responder a este mensaje
#2 flyguille
18/11/2010 - 20:22 | Informe spam
On 18 nov, 11:59, "Langosta" wrote:
"flyguille" escribi en el mensaje de noticiasnews:



> fast grayscaling a big bitmap trucolor (like 12000y, 9600x pix) in vb6

> I already googled a lot, take GDI+ tutorials, and everything. But I
> don't want it in the slow way

> So, I wondered if that well know VB code about making a colourmatrix
> is possible to translate to work in VB5/6?

> [CODE]
>   Dim dlg As OpenFileDialog = New OpenFileDialog()
>    dlg.Filter = "Image files (*.BMP, *.JPG, *.GIF)|*.bmp;*.jpg;*.gif"
>    If dlg.ShowDialog() = DialogResult.OK Then
>      Dim img As Image = Image.FromFile(dlg.FileName)
>      Dim bm As Bitmap = New Bitmap(img.Width, img.Height)
>      Dim g As Graphics = Graphics.FromImage(bm)
>      Dim cm As ColorMatrix = New ColorMatrix(New Single()() _
>           {New Single() {0.3, 0.3, 0.3, 0, 0}, _
>          New Single() {0.59, 0.59, 0.59, 0, 0}, _
>          New Single() {0.11, 0.11, 0.11, 0, 0}, _
>          New Single() {0, 0, 0, 1, 0}, _
>          New Single() {0, 0, 0, 0, 1}})

>    Dim ia As ImageAttributes = New ImageAttributes()
>      ia.SetColorMatrix(cm)
>      g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height), 0,
> 0, img.Width, img.Height, GraphicsUnit.Pixel, ia)
>      g.Dispose()
>      Me.BackgroundImage = bm
>    End If

> [/CODE]

> strip out the img loading lines, i already have the image in a
> StdPicture, maybe I can to setup a DC and selecting the bitmap of the
> stdpicture but... how to implement that colorMatrix thing in VB6?

> anybody has the routine already done? i don't want to reinvent the
> whell.

Digamos que tu imagen es de 24 bits. Recuperas es array de bits
(GetDIBits) y recorres pixel a pixel haciendo el siguiente c lculo

byte_indice = byte_rojo * 0.3 + byte_verde * 0.59 + byte_azul * 0.11

esa es la operaci n representada en la matriz.

una imagen en escala de grises, es un bitmap indexado de 8 bits

la primer entrada en la paleta es 0, 0, 0, 0
la segunda 1, 1, 1, 0
la ltima 255, 255, 255, 0

Todo bien.



pixel per pixel loop at VB6 code, is what I means with "the slow slow
way"

ia.SetColorMatrix(cm)
g.DrawImage

and that functions are .net not equivalent api call ?
Respuesta Responder a este mensaje
#3 Leonardo Azpurua
18/11/2010 - 20:42 | Informe spam
"flyguille" escribió en el mensaje
news:
pixel per pixel loop at VB6 code, is what I means with "the slow slow
way"

ia.SetColorMatrix(cm)
g.DrawImage

and that functions are .net not equivalent api call ?



Si vas a escribir en inglés en un foro en español, podías al menos
esforzarte por hacerlo bien, digo yo.
Respuesta Responder a este mensaje
#4 Langosta
18/11/2010 - 21:42 | Informe spam
"flyguille" escribió en el mensaje de noticias
news:

pixel per pixel loop at VB6 code, is what I means with "the slow slow
way"

ia.SetColorMatrix(cm)
g.DrawImage

and that functions are .net not equivalent api call ?

=
Sin duda puedes tener una conversión 1 a 1 del código que posteaste a
VB.

Lo "único" que necesitas es la versión del wraper del gdi+. Lo que ves
en net es simplemente la versión "manejada" del wraper existente (en
C++), para la biblioteca de windows, que tiene la típica interface de
funciones exportadas. Digo, nada tiene que hacer el gdi+ con dotnet.

Yo conozco el wraper para C++, pero tengo la impresión de haberlo visto
portado por alguien para VB.

Si no consigues el wraper puedes usar la biblioteca a fuerza de
"declares". Te advierto que la documentación es miserable.

En cuanto a la lentitud de hacer la transformación implementando el
algoritmo por tu cuenta, habría que ver qué es lo que estás haciendo.

Todo bien.
Respuesta Responder a este mensaje
#5 Langosta
18/11/2010 - 21:43 | Informe spam
"Leonardo Azpurua" escribió en el mensaje de
noticias news:ic3vho$g39$

"flyguille" escribió en el mensaje
news:
pixel per pixel loop at VB6 code, is what I means with "the slow slow
way"

ia.SetColorMatrix(cm)
g.DrawImage

and that functions are .net not equivalent api call ?



Si vas a escribir en inglés en un foro en español, podías al menos
esforzarte por hacerlo bien, digo yo.






Buenas noches, señor.

Todo bien.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida