for i:= 0 to 255 do
      begin
        lplogpal.palPalEntry[i].peRed :=i;
        lplogpal.palPalEntry[i].peGreen :=i;
        lplogpal.palPalEntry[i].peBlue :=i;
        histogram[i] := 0;
      end;
    bitmap.Palette := CreatePalette(pLogPalette(lpLogPal)^);
    FreeMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));
    for i := 0 to (bitmapSrc.Height -1)  do   
      begin
        ppSrc := bitmapSrc.ScanLine[i];
        ppDest := bitmap.ScanLine[i];
        j:=0;
        while j <= (bitmapSrc.Width - 1) do
          begin
            ppDest[j] := trunc(ppSrc[j*PixelNum]*0.114 + ppSrc[j*pixelNum + 1]*0.587
                               + ppSrc[j*PixelNum + 2]*0.299+0.5);
            Inc(j);
          end;
//        bitmapSrc.Assign(bitmap);
//        ptr:=bitmap.ScanLine[i];
//        for n := 0 to (bitmap.Width-1) do
//            begin
//              histogram[ptr[n]]:= histogram[ptr[n]]+1 ;
//            end;
      end;
    bitmapSrc.Assign(bitmap);    try
      for m:= 0 to (bitmap.Height-1) do
        begin
          ptr:=bitmap.ScanLine[m];          for n := 0 to (bitmap.Width-1) do
            begin
              histogram[ptr[n]]:= histogram[ptr[n]]+1 ;
            end;
        end;
    except    end;
想精简下 变成一个循环 但是想不明白

解决方案 »

  1.   

    好像没有太多优化的空间,看下下面的优化会不会影响你的功能。
    for i:= 0 to 255 do
          begin
            lplogpal.palPalEntry[i].peRed :=i;
            lplogpal.palPalEntry[i].peGreen :=i;
            lplogpal.palPalEntry[i].peBlue :=i;
            histogram[i] := 0;
          end;
        bitmap.Palette := CreatePalette(pLogPalette(lpLogPal)^);
        FreeMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));
        for i := 0 to (bitmapSrc.Height -1)  do   
          begin
            ppSrc := bitmapSrc.ScanLine[i];
            ppDest := bitmap.ScanLine[i];
            j:=0;
            while j <= (bitmapSrc.Width - 1) do
              begin
                ppDest[j] := trunc(ppSrc[j*PixelNum]*0.114 + ppSrc[j*pixelNum + 1]*0.587
                                   + ppSrc[j*PixelNum + 2]*0.299+0.5);
                histogram[ppDest[j]]:= histogram[ppDest[j]]+1 ;
                Inc(j);
              end;
    //        bitmapSrc.Assign(bitmap);
    //        ptr:=bitmap.ScanLine[i];
    //        for n := 0 to (bitmap.Width-1) do
    //            begin
    //              histogram[ptr[n]]:= histogram[ptr[n]]+1 ;
    //            end;
          end;
        bitmapSrc.Assign(bitmap);
     
        {try
          for m:= 0 to (bitmap.Height-1) do
            begin
              ptr:=bitmap.ScanLine[m];
     
              for n := 0 to (bitmap.Width-1) do
                begin
                  histogram[ptr[n]]:= histogram[ptr[n]]+1 ;
                end;
            end;
        except
     
        end;}