Jump to content


Photo

[Truco Delphi] Invertir un Bitmap

invertir bitmap graficos source fuente

  • Please log in to reply
2 replies to this topic

#1 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 545 posts
  • Location127.0.0.1

Posted 18 August 2016 - 11:59 AM

[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
  • 6295 posts
  • LocationArgentina

Posted 18 August 2016 - 05:39 PM

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
  • 832 posts
  • LocationMisiones, Argentina

Posted 18 August 2016 - 10:41 PM

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





Also tagged with one or more of these keywords: invertir, bitmap, graficos, source fuente

IP.Board spam blocked by CleanTalk.