![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
|
Histograma
Hola a todos,
estoy realizando una aplicación para la generación de imágenes en 3D: http://imagen3d.site88.net/ Esta aplicación muestra un histograma donde se muestran los valores de los tres componentes de color primarios (Rojo, Azul y Verde). http://imagen3d.site88.net/img/ayuda9.jpg El código que utilizo para generar el histograma es el siguiente: Código:
CONST
MaxPixelCount = 32768;
TYPE
pRGBTripleArray = ^TRGBTripleArray; // Use SysUtils.pByteArray for 8-bit color
TRGBTripleArray = ARRAY[0..MaxPixelCount-1] OF TRGBTriple;
procedure TFormSide.Action1Execute(Sender: TObject);
var
i,j : integer;
Row: pRGBTripleArray;
BmpSbS : TBitmap;
//Histograma
HRa,HBa,HGa: array[1..256] of integer; //Componentes del histograma
R,G,B,Color : integer;
begin
//Reinicia Histograma
FillChar(HRa,Sizeof(HRa),#0);
FillChar(HGa,Sizeof(HGa),#0);
FillChar(HBa,Sizeof(HBa),#0);
BmpSbS := TBitmap.Create;
TRY
//Utilizo la librería gráficos LibGFL de XnView para cargar las imágenes
//gfl_bmpSbS contiene la imagen a mostrar en pantalla
BmpSbS.PixelFormat := pf24bit;
BmpSbS.Width := gfl_bmpSbS.Width;// Ancho de la imagen
BmpSbS.Height := gfl_bmpSbS.Height;//Alto de la imagen
FOR j := 0 TO BmpSbS.Height-1 DO
BEGIN
Row := BmpSbS.Scanline[j];
FOR i := 0 TO BmpSbS.Width-1 DO
BEGIN
gflGetColorAt(gfl_bmpSbS,i,j,Pgfl_colorSbS);//Obtiene el valor de las componentes RGB
WITH Row[i] DO
BEGIN
rgbtRed := pgfl_colorSbS.Red;
rgbtBlue := pgfl_colorSbS.Blue;
rgbtGreen := pgfl_colorSbS.Green;
//Histrograma
inc(HRa[rgbtRed]);
inc(HGa[rgbtGreen]);
inc(HBa[rgbtBlue]);
END
END
END;
FormSide.Image1.Picture.Graphic := BmpSbS; // Muestra la imagen
PanelPImagen1.Width := BmpSbS.Width + 2;
PanelPImagen1.Height := BmpSbS.Height + 2;
FINALLY
BmpSbS.Free; //Libera Memoria
END;
//Histograma
//Hay que calcular el valor máximo siempre y cuando HmaxSideCal sea TRUE. Esto lo realizo para que sólo se realice el cálculo la primera vez que se muestra
//la imagen y no cada vez que variemos la saturación, el contraste, etc... de la imagen
if HmaxSideCal then
begin
HMaxSideCal := False; //Para que no se vuelva a calcular el valor máximo del Histograma
HmaxSide:= 1;
for i:= 1 to 256 do
begin
if HRa[i] > HmaxSide then HmaxSide:= HRa[i];
if HGa[i] > HmaxSide then HMaxSide:= HGa[i];
if HBa[i] > HmaxSide then HmaxSide:= HBa[i];
end;
end;
ImageHa.Canvas.FillRect(ImageHa.Canvas.ClipRect);
//Muestra el Histograma
for i:= 1 to 256 do
begin
HRa[i] := Trunc((HRa[i] / HmaxSide) * 100);
HGa[i] := Trunc((HGa[i] / HmaxSide) * 100);
HBa[i] := Trunc((HBa[i] / HmaxSide) * 100);
for j := 1 to 256 do
begin
if j > HRa[i] then R := 0 else R := 255;
if j > HGa[i] then G := 0 else G := 255;
if j > HBa[i] then B := 0 else B := 255;
if (R = 0) and (G = 0) and (B = 0) then Color := RGB(64,64,64) //
else Color := RGB(R,G,B);
ImageHa.Canvas.Pixels[i-1,101-j] := Color;
end;
end;
end;
¿A alguien se le ocurre alguna fórmula para aumentar la velocidad al mostrar el histograma? Última edición por madiazg fecha: 05-07-2008 a las 23:14:31. |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Histograma en Delphi | Cesar Junior | Gráficos | 10 | 05-07-2012 12:36:42 |
| Histograma. Obtener máximos y mínimos relativos | Delphius | Varios | 7 | 16-04-2007 12:12:46 |
| Histograma | javikanin | Varios | 16 | 02-01-2006 23:40:17 |
| Graph Meter (histograma) | cadena | Gráficos | 0 | 01-12-2004 19:29:23 |
|