Ir al contenido


Foto

[Truco Delphi] Invertir un Bitmap

invertir bitmap graficos source fuente

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

#1 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 545 mensajes
  • Location127.0.0.1

Escrito 18 agosto 2016 - 11:59

[Truco Delphi] Invertir un Bitmap


delphi
  1. function InvertBmp(SourceBmp:Tbitmap): TBitMap;
  2. var
  3. i,j :longint;
  4. tmp : TBitMap;
  5. Red, Green, Blue: Byte;
  6. PixelColor: Longint;
  7. begin
  8. tmp := TBitmap.Create;
  9. tmp.width := SourceBmp.width;
  10. tmp.height := SourceBmp.height;
  11. for i := 0 to SourceBmp.width-1 do
  12. begin
  13. for j := 0 to SourceBmp.height-1 do
  14. begin
  15. PixelColor := ColorToRGB(SourceBmp.Canvas.Pixels[i,j]);
  16. Red := PixelColor;
  17. Green := PixelColor shr 8;
  18. Blue := PixelColor shr 16;
  19. red := 255-red;
  20. green := 255-green;
  21. blue := 255-blue;
  22. tmp.canvas.pixels[i,j] := (red shl 8+green) shl 8+blue;
  23. end;
  24. end;
  25. Result := tmp;
  26. end;

Saludos!


  • 1

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 18 agosto 2016 - 05:39

Más que "invertir" el término adecuado debiera ser obtener Negativo. Pero como puedes observar en mi código ni yo me pude resistir de añadir un comentario con esa palabra.

 

Con el método de Scanline[] te evitas lidiar con esos cálculos. Por ejemplo:


delphi
  1. Image.Bitmap.PixelFormat := pf24bit;
  2. for j := 0 to Image.Bitmap.Height - 1 do
  3. begin
  4. PChannel := Image.Bitmap.ScanLine[j];
  5. for i := 0 to Image.Bitmap.Width - 1 do
  6. begin
  7. // por cada canal:
  8. for k := RED downto BLUE do
  9. // Invertimos el color
  10. PChannel^[k] := MAX_RGB - PChannel^[k];
  11. Inc(PChannel);
  12. end;
  13. end;

Siendo MAX_RGB una constante, y por supuesto teniendo el valor 255.

Nuevamente, aviso que esto fue diseñado en un D6 y con mi "mini framework" que comenté en el otro truco. Aunque muy posiblemente pueda portarse sin demasiados problemas a nuevas versiones de Delphi sin mayores complicaciones.

 

Saludos,


  • 1

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 824 mensajes
  • LocationMisiones, Argentina

Escrito 18 agosto 2016 - 10:41

Si, en realidad es un negativo Delphius. Pero eso es invertir una imagen.

Otras operaciones serían reflejar, girar, ampliar, reducir, sesgar, o cosas más complejas como aplicar efectos de transformación matricial.

Scanline en realidad es una forma de ver una fila, pero en definitiva es lo mismo, es como hacer un casting y luego meterse dentro de esa fila para recorrerla. Lo que cambiaría es eso de la resta por operaciones booleanas como


delphi
  1. tmp.canvas.pixels[i,j]:= not tmp.canvas.pixels[i,j];

En fin... ¡hay tantas formas!

Saludos


  • 1





Etiquetado también con una o más de estas palabras: invertir, bitmap, graficos, source fuente