for y := 0 to BitImg.Picture.Bitmap.Height - 1 do
begin
  b := BitImg.Picture.Bitmap.ScanLine[y];
  for x := 0 to BitImg.Picture.Bitmap.Width - 1 do
  begin
    //一个象素点三个字节
    Gray := Round(b[x * 3 + 2] * 0.3 + b[x * 3 + 1] * 0.59 + b[x * 3] * 0.11);
    if gray > 128 then //全局阀值
    begin
      b[x * 3] := 255;
      b[x * 3 + 1] := 255;
      b[x * 3 + 2] := 255;
    end
    else
    begin
      b[x * 3] := 0;
      b[x * 3 + 1] := 0;
      b[x * 3 + 2] := 0;
    end;
  end;
end;上面的代码将24位图二值化后保存的图片文件体积太大。
BitImg.Picture.Bitmap.PixelFormat := pf1bit;
这样保存成1位图后,颜色太暗了。如何保持二值化后的图像亮度,并大大减小保存后的bmp图片文件所占空间???  请高手指点  谢谢

解决方案 »

  1.   

    按理说亮度不会有什么变化啊实在不行的话,你这样
    var
      BitMap: TBitmap;
    begin
      BitMap := TBitmap.Create;
      BitMap.PixelFormat := pf1bit;
      BitMap.Assing(BitImg.Picture.Bitmap);
    end;
      

  2.   

    if gray > 128 这个条件可能不太合适,尝试改的更小试试?
      

  3.   

    看下 原来的 PixelFormat  是多少啊;
    你处理后的 应该是 pf24bit吧
      

  4.   


    var
      x, y, Gray:Integer;
      b, t: PByteArray;
      Pal: TMaxLogPalette;
    begin
      for y := 0 to BitImg.Picture.Bitmap.Height - 1 do
      begin
        b := BitImg.Picture.Bitmap.ScanLine[y];
        for x := 0 to BitImg.Picture.Bitmap.Width - 1 do
        begin
        //一个象素点三个字节
          Gray := Round(b[x * 3 + 2] * 0.3 + b[x * 3 + 1] * 0.59 + b[x * 3] * 0.11);
          if gray > 128 then //全局阀值
          begin
            b[x * 3] := 255;
            b[x * 3 + 1] := 255;
            b[x * 3 + 2] := 255;
          end
          else
          begin
            b[x * 3] := 0;
            b[x * 3 + 1] := 0;
            b[x * 3 + 2] := 0;
          end;
        end;
      end;
      BitImg.Picture.Bitmap.PixelFormat := pf1bit;
      LongWord(Pal.palPalEntry[0]) := $000000;
      LongWord(Pal.palPalEntry[1]) := $ffffff;
      Pal.palVersion := $300;
      Pal.palNumEntries := 2;
      BitImg.Picture.Bitmap.Palette := CreatePalette(PLogPalette(@Pal)^);
      BitImg.Invalidate;
    end;
      

  5.   

    除非你的BitImg.Picture源图不是BMP类型,如jpeg,png类型等,不过同样也得不到24位或者32位的黑白图。
      

  6.   


    您提供的代码,执行结果很奇怪,具体表现为:procedure TForm1.FormCreate(Sender: TObject);
    var
      x, y, Gray:Integer;
      b, t: PByteArray;
      Pal: TMaxLogPalette;
    begin
      // BitImg是TImage控件,在里面手动载入24位色深的bmp图片,结果可以得到想要的1位色深bmp图片
      BitImg.Picture.Bitmap.PixelFormat := pf1bit;  LongWord(Pal.palPalEntry[0]) := $000000;
      LongWord(Pal.palPalEntry[1]) := $ffffff;
      Pal.palVersion := $300;
      Pal.palNumEntries := 2;
      BitImg.Picture.Bitmap.Palette := CreatePalette(PLogPalette(@Pal)^);
      BitImg.Invalidate;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var
      x, y, Gray:Integer;
      b, t: PByteArray;
      Pal: TMaxLogPalette;
    begin
      BitImg.Picture.LoadFromFile('c:\pic24.bmp');  //动态载入24位bmp图片,结果得到的图片全黑
      BitImg.Picture.Bitmap.PixelFormat := pf1bit;  LongWord(Pal.palPalEntry[0]) := $000000;
      LongWord(Pal.palPalEntry[1]) := $ffffff;
      Pal.palVersion := $300;
      Pal.palNumEntries := 2;
      BitImg.Picture.Bitmap.Palette := CreatePalette(PLogPalette(@Pal)^);
      BitImg.Invalidate;
    end;
      

  7.   


    动态载入时需要先设置bmp的PixelFormat然后就正常了,非常感谢阿发伯的指导!