Ir al contenido


Foto

PASAR UNA IMAGEN BMP A ESCALA DE GRISES


  • Por favor identifícate para responder
5 respuestas en este tema

#1 sergiocapillera2013

sergiocapillera2013

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 13 mayo 2013 - 06:18

Hola nuevamente, quiero saber si alguien puede ayudarme con el código que no me deja pasar a escala de grises mi imagen bmp , éste es el código:



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   bmp: TBGRABitmap;
  4.   p: PBGRAPixel;
  5.   n: integer;
  6.   mediana:integer;
  7.  
  8. begin
  9.     bmp := TBGRABitmap.Create('image.png');
  10.     p := bmp.Data;
  11.     for n := bmp.NbPixels-1 downto 0 do
  12.     begin
  13.         // p^.red := not p^.red;  //invert red canal
  14.           //inc(p);
  15.           mediana:=round((p^.red+p^.green+p^.blue)/3);
  16.           p^.red:=mediana;
  17.           p^.green:=mediana;
  18.           p^.blue:=mediana;
  19.  
  20.  
  21.     bmp.InvalidateBitmap;  //note that we have accessed directly to pixels
  22.     bmp.Draw(Canvas,0,0,True);
  23.     bmp.Free;
  24.  
  25. end;



Me salta error en  TBGRABitmap; Que no está bien declarado o que falta declarar ¿Cómo lo declaro en Lazarus?
Saludos, espero respuesta a la brevedad.
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 mayo 2013 - 08:17

Hola,
He editado tu mensaje para añadir las etiquetas y formato adecuado al código. Observa como se resalta ahora.
Además he alterado esas horrorosas mayúsculas. No nos grites, ¡te leemos fuerte y claro! Por favor respeta las normas (has faltado a la 2da por empezar), ten en cuenta las sugerencias y recomendaciones para postear y ahora te voy a pedir que empieces a hacer uso de las etiquetas.

Se que has comenzado con mal pie. No lo tomes como un castigo, simplemente es un pedido que hacemos para mantener las cosas en órden.

Veo que recién aclaras que se trata de Lazarus. En algunas cosas Lazarus es diferente a Delphi, y el truco que yo había compartido es exclusivo para Delphi.
No dispongo de demasiado tiempo en estas horas, pero en cuanto pueda veré en como asesorarte. Yo dispongo de Lazarus, en mi partición Linux,aunque no lo he tanteado suficiente.

Por lo pronto me surgen dudas. ¿Ese es tu código o lo sacaste de algún lado? Si no es tuyo, deberías indicarnos donde lo conseguiste... esto puede ayudar a determinar efectivamente de que va el problema. ¿Cuáles son exactamente los errores que te han surgido?

Por lo que estuve consultado en la ayuda, a vista rápida, TBGRABitmap es una clase que trabaja con nivel de transparencias, por lo que no se trata del esquema RGB convencional sino que se añade el canal alfa.
El esquema interno dice que cada pixel está compuesto por 4 valores (o mejor dicho campos), rojo, azul, verde y alfa. de 4 bytes. El alfa va de 0 a 255 para indicar el nivel de transparencia. 0 es 100% trasparente, mientras que 255 es opaco (o 0% transparente).
Esto hay que tener en cuenta cuando se trabaja con los pixeles, aunque si no se toca el alfa no debiera ser problema.

El mayor problema, hasta el momento (no descarto que se me esté pasando otros), que veo en tu código es que en ningún momento incrementas el valor del puntero. para moverte al próximo pixel. Tienes comentado justamente el inc(p). Una vez que estableces el valor del canal RGB debes hacer inc(p). Es decir:



delphi
  1. mediana:=round((p^.red+p^.green+p^.blue)/3);
  2. p^.red:=mediana;
  3. p^.green:=mediana;
  4. p^.blue:=mediana;
  5. inc(p);



El otro error que veo es que a tu for le añadiste un begin, pero no su end.

Corrige esos dos puntos y veamos como sigue.

Saludos,
  • 0

#3 sergiocapillera2013

sergiocapillera2013

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 14 mayo 2013 - 04:14

He modificado lo que me has aconsejado y aún me aparecen errores como:  unit1.pas(1,1) Fatal: Can't find unit BGRABitmap used by Unit1
La verdad que no se como solucionarlo , lo que saque de las wikis de LAZARUS al código y lo modifique para que realice el promedio de los tres colores, te paso el código para que puedas resaltarme mis errores y poder sugerirme otra ideas, saludos, disculpa por mis errores del uso del foro , recien empiezo a interactuar por este medio , y me gustaría que me digas y me aclares a que le llamas armar hilo no es lo que hice??? abrir  mi problemática??? saludos , te paso el código;



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   image1.Picture.LoadFromFile('mariposa.bmp');
  4. end;
  5.  
  6. procedure TForm1.Button2Click(Sender: TObject);
  7. var
  8.   bmp: TBGRABitmap;
  9.   p: PBGRAPixel;
  10.   n: integer;
  11.   mediana:integer;
  12.  
  13. begin
  14.     bmp := TBGRABitmap.Create('mariposa.bmp');
  15.     p := bmp.Data;
  16.     for n := bmp.NbPixels-1 downto 0 do
  17.         // p^.red := not p^.red;  //invert red canal
  18.  
  19.           mediana:=round((p^.red+p^.green+p^.blue)/3);
  20.           p^.red:=mediana;
  21.           p^.green:=mediana;
  22.           p^.blue:=mediana;
  23.           inc(p);
  24.     end;
  25.  
  26.     bmp.InvalidateBitmap;  //note that we have accessed directly to pixels
  27.     bmp.Draw(Canvas,0,0,True);
  28.     bmp.Free;
  29.  
  30. end;



  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 14 mayo 2013 - 08:21

sergiocapillera2013
Ese error te está indicando que en la sección uses te falta añadir la/s unidad/es que forman parte de TBGRABitmap. En el enlace sobre la documentación oficial que expuse en mi post aclara perfectamente esto:



delphi
  1. uses Classes, SysUtils, BGRABitmap, BGRABitmapTypes;



Te falta declarar, mínimo, las 2 últimas unidades.

Ahora tu error está en que borraste el begin del for. La sintaxis de Object Pascal (y Pascal en general) dice que cuando se van a ejecutar varias sentencias, éstas deben estar entre un begin y un end.

Es decir:



delphi
  1. for i := 0 to 10 do
  2. begin
  3.   // aquí las sentencias
  4. end;



Si no colocas el begin y el end el compilador protestará indicando que no se ha encontrado correspondencias entre cada begin y end. Es muy simple: debes tener tantos begins como ends.

Fundamental sangrar (mal dicho identar) el código. Ayuda mucho a detectar estos problemas.

No copies código por copiar y esperes que todo funcione mágicamente. Mínimo hay que documentarse y leer. Por ello es que en DelphiAccess ponemos tanto énfasis en un que se vaya razonando sobre los pasos y el código que nos van exponiendo. Nosotros somos guías y ofrecemos alternativas, pistas, sugerencias, propuestas, y de vez en cuando la solución. Esto lo hacemos para ayudarles a desarrollar el sentido analítico y que vayan entendiendo las cosas.

Aquí hay una serie de tutorial sobre TBGRABitmap. Considero de mucha utilidad ir dándole lectura al tema. Ayudará mucho a comprender como usarlo apropiadamente.

Respecto a "abrir un hilo" es el término que se emplea en los Foros para indicar que para tratar las dudas se debe iniciar un nuevo tema (o también conocido como hilo). Cada mensaje dado en el hilo se lo denomina post. En otros sitios directamente llaman post al propio hilo. Quizá es lo que te llama a confusión.
Recomendamos que antes de iniciar un nuevo hilo que se haga una búsqueda. Puede que ya alguien haya preguntado lo mismo o algo similar. Se puede aprovechar un hilo abierto, mientras este hilo respete la temática de tu duda y no esté en un apartado como Tutoriales por ej.
Esos hilos son a modo de exposición que ofrecemos a la comunidad e invitamos a que si tienen dudas o dificultades sobre los tutoriales, manuales, o trucos que en lugar de exponerlos en dicho hilo se los trate de forma separada a fin de no mezclar los artículos con sus dudas. De otro modo se hará una confusión generalizada y el hilo pierde su esencia primaria convirtiéndose en un "hilo de dudas" que en un artículo.

En unas horas puedo examinar si hay más problemas con el código. Pero a como estoy leyendo y viendo no debiera de haber más problemas si haces las correcciones que te he sugerido.

Saludos,
PD: Debes acostumbrarte a utilizar las etiquetas. En este caso utiliza las de Delphi que son válidas para el código de Lazarus.
  • 0

#5 sergiocapillera2013

sergiocapillera2013

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 14 mayo 2013 - 05:29

:sad: Marcelo, hice lo que me sugeriste y sigo con problemas , cuando ejecuto el lazarus me remarca de color anaranjado los uses StdCtrls, ExtCtrls, BGRABitmap, BGRABitmapTypes; y no sigue más , que me ha faltado ??? te paso como tengo el código :



delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  9.   StdCtrls, ExtCtrls, BGRABitmap, BGRABitmapTypes;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     Button1: TButton;
  17.     Button2: TButton;
  18.     Image1: TImage;
  19.     Image2: TImage;
  20.     procedure Button1Click(Sender: TObject);
  21.     procedure Button2Click(Sender: TObject);
  22.   private
  23.     { private declarations }
  24.   public
  25.     { public declarations }
  26.   end;
  27.  
  28. var
  29.   bmp: TBGRABitmap;
  30.   p: PBGRAPixel;
  31.   n: integer;
  32.   mediana:integer;
  33.  
  34.   Form1: TForm1;
  35.  
  36. implementation
  37.  
  38. { TForm1 }
  39.  
  40. procedure TForm1.Button1Click(Sender: TObject);
  41. begin
  42.         Image1.Picture.LoadFromFile('mariposa.bmp');
  43.  
  44. end;
  45.  
  46. procedure TForm1.Button2Click(Sender: TObject);
  47.  
  48. begin
  49.     bmp := TBGRABitmap.Create('mariposa.bmp');
  50.     p := bmp.Data;
  51.     for n := bmp.NbPixels -1 downto 0 do
  52.         // p^.red := not p^.red;  //invert red canal
  53.     begin
  54.           mediana:=round((p^.red+p^.green+p^.blue)/3);
  55.           p^.red:=mediana;
  56.           p^.green:=mediana;
  57.           p^.blue:=mediana;
  58.           inc(p);
  59.     end;
  60.  
  61.     bmp.InvalidateBitmap;  //note that we have accessed directly to pixels
  62.     bmp.Draw(Canvas,0,0,True);
  63.     bmp.Free;
  64.  
  65. end;                                   


te agradezco si me podés dar una mano , no lo puedo hacer que pase a escala de grises una imagen llamada 'mariposa.bmp'

saludos espero tu respuesta a la brevedad.  :sad:
  • 0

#6 circular

circular

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 18 julio 2013 - 07:06

Tu problema ahora es que Lazarus no puede encontrar BGRABitmap. Es el tema del primero tutorial:
http://wiki.freepasc...p_tutorial_1/es

Necesita una referencia a BGRABitmap en el proyecto
  • 0




IP.Board spam blocked by CleanTalk.