Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-05-2007
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Genial, muchas gracias por los códigos, el de cargar la imagen me va perfecto, los otros no tanto, pero no pasa nada, me va con asignarle directamente el valor de X e Y, supongo que es porque uso el Canvas del formulario y no el de la imagen.
Ahora el problema que tengo es que no sé guardar la imagen como jpg, no sé cambiarla de formato, he probado mil cosas modificando el código que me pasaste de cargar pero nada, casi ni sabía o que hacía, finalmente he acabado por poner "Imagen.Picture.Graphic.SaveToFile('.\Imagen.jpg');" que lo guarda, pero como bitmap, que ocupa 3 megas y pico...
He probado también a modificar la imagen simplemente "Imagen.Canvas.Pixels[7,7]:=clBlue;" en un botón para ver cómo va, y lo hace y lo guarda bien, supongo que es la manera de la que haré los números, aunque si supiérais decirme una manera más profesional de hacerlo poniendo números de verdad sería genial.
Por lo pronto me opndré a diseñar los algoritmos que dibujen los números sobre la cuadrícula y el diseño del programa, cuando haya terminado me pondré a ver si consigo que me lo guarde en JPEG, que por lo pronto va bien con el bitmap y no me puedo quejar tanto...

Editaba el post para no apropiarme del primer puesto del foto cada vez que me daba por relatar algo xD pero bueno, a partir de ahora crearé una respuesta nueva.
Un saludo y muchas gracias por toda la ayuda y por vuestro tiempo.
Responder Con Cita
  #2  
Antiguo 20-05-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Como el procesamiento se realiza sobre un mapa de bits, al intentar guardarlo como jpg fallará. Para hacer esto deberás convertir tu mapa de bits a jpg empleando la clase TJPEGImage:

Código Delphi [-]
               procedure TForm1.Button1Click(Sender: TObject);
               var 
                 MyJPEG : TJPEGImage;
                 MyBMP  : TBitmap;
               begin 
                 MyBMP := TBitmap.Create;
                 with MyBMP do 
                   try
                     {Cargamos el BMP}
                     {Load the BMP} 
                     LoadFromFile('YourBmpHere.BMP');
                     MyJPEG := TJPEGImage.Create;
                     with MyJPEG do begin 
                       Assign(MyBMP);
                       {Grabamos el JPG}
                       {Save the JPG}
                       SaveToFile('YourJpegHere.JPEG');
                       Free;
                     end; 
                   finally
                     Free;
                   end; 
               end;
Este código lo saqué de trucomania (Truco n° 147).

He visto que empleas la orden Pixels[] para que de acuerdo a una coordenada puedas conocer el valor. La misma ayuda de Delphi aclara que emplear este método es lento. Que es recomendable usar ScanLine().

Lo malo de emplear scanline es que es un poquito más complicado. Ya que hay que ir corriendo el puntero...

Las coordenadas la obtienes como dice seoane:
Código Delphi [-]
function RatonAImagenX(Imagen: TImage; x: integer): integer;
begin
  Result:= (x * Imagen.Picture.Width) div Imagen.Width;
end;

function RatonAImagenY(Imagen: TImage; y: integer): integer;
begin
  Result:= (y * Imagen.Picture.Height) div Imagen.Height;
end;
Ahora para acceder al pixel debemos hacer esto:

1. Tener un puntero de tipo array para acceder a los canales RGB de dicho pixel:
Código Delphi [-]
type
TRGB = array[1..3] of byte;
PRGB = ^TGRB;

2. Accedemos la la posición de memoria en la coordenada Y:
Código Delphi [-]
var RGB = PRGB;
....
RGB := Picture.Bitmap.ScanLine[Y];

3. Una vez ubicados en la posición Y, nos movemos sobre el eje horizontal X veces:
Código Delphi [-]
for pos := 0 to X do
     inc(RGB);

4. Ahora, en RGB quedó registrado el valor de cada canal (Azul = 1, Verde = 2, Rojo = 3). Como sabrás, dicho valor está comprendido en el rango: [0,255]

Código Delphi [-]
Rojo := RGB[3];
Verde := RGB[2];
Azul := RGB[1];

Tiene un poco más de código, pero el acceso mediante scanline es más rápido que el por Pixels. Sobre todo si es que la imagen es grande.

Yo hice una pruebas (del tipo filtrado) "Pixels vs Scanline" y la verdad es que puede llegar a ser perceptible la lentitud.

Espero que te sirva.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 21-05-2007
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Muchas gracias, ahora ya guarda, he modificado un poco el código, porque yo uso un Dialog de guardado para seleccionar la ruta, por si queréis ver cómo ha quedado, lo pongo aquí:
Código Delphi [-]
procedure TFormulario.ActGuardarExecute(Sender: TObject);
var
  FotoJPEG : TJPEGImage;
  FotoBMP  : TBitmap;
begin
    if DiaGuardar.Execute then
    begin
      FotoBMP := TBitmap.Create;
      try
        FotoBMP:=Imagen.Picture.Bitmap;
        FotoJPEG:=TJPEGImage.Create;
        with FotoJPEG do
        begin
          Assign(FotoBMP);
          SaveToFile(DiaGuardar.FileName);
          Free;
        end;
      finally
        FotoBMP.Free;
    end;
end;

La manera que me has dado de manejar los pixels con el ScanLine ahora mismo no la entiendo, entre otras cosas, nunca he utilizado punteros en Pascal, así que por ahora voy a hacerlo con la propiedad pixels, que ya me manejo bien con ella, y cuando termine el programa estudiaré el código que me has pasado y lo modificaré y usando el Scanline, que con Pixels va bastante lento el programa, ya que las imagenes que se le pasan son grandísimas.

Ahora estoy con que me escriba los números en cada casilla. Mi profesor me ha dicho hoy una manera muy fácil de hacerlo, usando la propiedad Imagen.Canvas.TextOut, pero el fondo del número me lo pinta en blanco y no me gusta el formato del número, así que me he creado un BMP con los números dibujados usando como base el tamaño de los pixels de la imagen, me queda hacer que funcione bien.
Un saludo, muchas gracias por toda la ayuda que me estáis prestando, si no fuera por vosotros no habría podido manejar bien las imágenes.
Responder Con Cita
  #4  
Antiguo 21-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Eres un hombre de recursos, si no conoces una función o una propiedad te las arreglas para seguir adelante. Eso esta muy bien

Para que no que no pinte el fondo de blanco al escribir utiliza esto primero:
Código Delphi [-]
  Imagen.Canvas.Brush.Style:= bsClear;
Responder Con Cita
  #5  
Antiguo 21-05-2007
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Jajajaja vale, muchas gracias. Es que yo he aprendido a programar con C en modo texto, y se aprende mucho así, con decirte que programé mi "Pong modo texto para 2 players" xD.
Axias ^_^.
Responder Con Cita
  #6  
Antiguo 22-05-2007
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Bueno, la aplicación, si se trata con cariño, ya es funcional desde ayer, iba a decirlo en un post, pero me dio un error el firefox y se cerró, después me dio pereza volver a escribirlo todo.
seoane, en relación a tu comentario también quería comentarte una función graciosa de mi programa, el problema que se me planteaba era que al comprobar los colores de cada pixel de la cuadrícula de la imagen sólo comprobaba el primero, y al ser JPG, es muy posible que no sea el color exacto buscado, así que lo hice a lo cafre, comprobando hasta encontrar algún pixel del color buscado o comprobarlos todos, que esa es otra cosa, en C, que es el lenguaje en el que estoy acostumbrado a programar, poniendo un "return TalCosa" la función termina y devuelve el valor, en Pascal con el result símplemente le asigna el valor y sigue ejecutando la función, así que apañé la función de esta manera:
Código Delphi [-]
function ComprobarPixel(ColorBuscado: TColor; X, Y: Integer):Boolean; //X e Y son las coordenadas desde la que empieza a buscar el color
var
  i,j: Integer;
  Encontrado: Boolean; //Esta variable es para salir rapidante de la función si encuentra el valor
begin
  with Formulario do
    for j:=0 to 11 do
    begin
      for i:=0 to 11 do
        if Imagen.Canvas.Pixels[X+i,Y+j]=EdtColor.Color then
        begin
          Encontrado:=True;
          break;
        end;
      if Encontrado=True then
        break;
    end;
    if Encontrado=True then
      Result := True
    else
      Result := False;
end;
EDIT:
Buahh! Que se me olvidaba... quería preguntaros por unas funciones que obtengan el color rojo, verde y azul de un RGB, es para crearme un rango al comprobar que un color es el blanco, por el problema de los JPG. He estado buscando en la ayuda y en el foro y no he encontrado nada...

Saludos.

Última edición por Kandorf fecha: 22-05-2007 a las 18:55:38.
Responder Con Cita
  #7  
Antiguo 22-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Todo es conocer el lenguaje:
Código Delphi [-]
        if Imagen.Canvas.Pixels[X+i,Y+j]=EdtColor.Color then
        begin
            Result:= True;
            Exit; //<-- Igual al return; de C
        end;
Pocas cosas podrás hacer en C que no puedas hacer en pascal. Yo hasta ahora no he encontrado ninguna ...

Para obtener los valores de rojo, verde y azul utiliza GetRValue, GetGValue y GetBValue.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
necesito ayuda para terminar un detalle vixente Conexión con bases de datos 0 01-06-2006 11:36:50
Necesito ayuda para imprimir por COM1... AFilth Impresión 3 11-02-2006 12:22:49
Necesito ayuda para manerjar archivos meosre Varios 2 08-09-2005 18:37:34
necesito ayuda para hacer un sistema para un billar rober Varios 14 29-07-2004 01:08:02
Necesito ayuda para aprobar... OnClick Varios 10 27-05-2003 02:12:05


La franja horaria es GMT +2. Ahora son las 18:16:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi