GDI+中 如何将彩色图象转化成二值图象?

zhangjinwei_52 2006-11-29 03:50:02
如题
...全文
302 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿发伯 2006-12-04
  • 打赏
  • 举报
回复
其实不能说是黑白2色,任何2色都是可以的,例子只是黑白的
阿发伯 2006-12-04
  • 打赏
  • 举报
回复
最后加上Imgae.Free;否则内存泄露^_^
阿发伯 2006-12-04
  • 打赏
  • 举报
回复
楼主好像考我的口气,下面的程序能实现黑白2色,不过黑与白的程度,也就是颜色的阀值因图片而异,得靠楼主自己了,既然楼主是研究这方面的,不用我多说吧!

uses GDIPAPI, GDIPOBJ;

{$R *.dfm}

const
maps: array[0..5] of ARGB = ($FFFF0000, $FF00FF00, $FF0000FF, $FFFFFF00, $FFFF00FF, $FF00FFFF);
Threshold = 0.5; // 阀值,这是黑白区分的关键

procedure TForm1.Button1Click(Sender: TObject);
var
tmp, Image: TGpBitmap;
attr: TGpImageAttributes;
g: TGpGraphics;
map: array[0..5] of TColorMap;
i, w, h: Integer;
begin
tmp := TGpBitmap.Create(Image1.Picture.Bitmap.Handle, Image1.Picture.Bitmap.Palette);
w := tmp.GetWidth;
h := tmp.GetHeight;
Image := TGpBitmap.Create(w, h);
attr := TGpImageAttributes.Create;
attr.SetThreshold(Threshold);
g := TGpGraphics.Create(Image);
g.DrawImage(tmp, MakeRect(0, 0, w, h), 0, 0, w, h, UnitPixel, attr);
tmp.Free;

for i := 0 to 5 do
begin
map[i].oldColor := maps[i];
map[i].newColor := aclWhite;
end;
attr.Reset;
attr.SetRemapTable(6, @map);
g.Free;

g := TGpGraphics.Create(Handle, False);
g.DrawImage(image, MakeRect(0, 0, w, h), 0, 0, w, h, UnitPixel, attr);
g.Free;
attr.Free;
end;
zhangjinwei_52 2006-12-04
  • 打赏
  • 举报
回复
maozefa(阿发伯)
不知你的所谓二值图是否就黑白二色,如果是,那更简单
/////////////////////////////////////////////////
就是黑白两色的,不知你是怎么个简单的方法,愿闻其详。
zhangjinwei_52 2006-12-04
  • 打赏
  • 举报
回复
多谢,给分了。
阿发伯 2006-12-04
  • 打赏
  • 举报
回复
我的资料就是.net类库参考,其实回答这类问题我很累,因为我的GDI+是自己写的,接近于.NET,回到这里,还必须重写一遍
zhangjinwei_52 2006-12-04
  • 打赏
  • 举报
回复
呵呵
由此看来你对GDI+是轻车熟路啊,能否给些相关的资料或是Demo啊?
阿发伯 2006-12-04
  • 打赏
  • 举报
回复
不是我考你,谁让你在那卖关子,说了简单却又不公布答案。
====================================================================================
哈哈,误会!你不说就是黑白2色,我怎好卖弄!我上面也就说说很简单,其实方案没想好,幸亏你一考,我就想出来了,哈哈!!!我从不用QQ的
zhangjinwei_52 2006-12-04
  • 打赏
  • 举报
回复
maozefa(阿发伯)
不是我考你,谁让你在那卖关子,说了简单却又不公布答案。
按你的方法问题已经解决。不知能否留下你的QQ,以后还要向你请教啊。
阿发伯 2006-12-01
  • 打赏
  • 举报
回复
to 老冯老弟:
昨天,下面的帖一直没人回,我也很忙,好不容易回了,而且分都得了,却有人事后评论,你来后请你看看,有比我代码更精简省事的吗?

http://community.csdn.net/Expert/topic/5198/5198160.xml?temp=.4719202
阿发伯 2006-12-01
  • 打赏
  • 举报
回复
不错,这不是真正的灰度图象,更不是我要的二值图象
==============================================================================
不知你的所谓二值图是否就黑白二色,如果是,那更简单
老冯 2006-12-01
  • 打赏
  • 举报
回复
今天晚上我来研究研究,看能不能搞点名堂出来.
zhangjinwei_52 2006-12-01
  • 打赏
  • 举报
回复
maozefa(阿发伯)能否加我QQ66516186
zhangjinwei_52 2006-12-01
  • 打赏
  • 举报
回复
不错,这不是真正的灰度图象,更不是我要的二值图象
阿发伯 2006-11-30
  • 打赏
  • 举报
回复
相信泽法大哥绝对没有错!顶^
============================================================================
sanmaotuo(老冯) ,这次你说错了,我这不是真正的灰度图,而是输出了一个黑色通道,近似于灰度图,真正灰度图要一个个点处理
老冯 2006-11-30
  • 打赏
  • 举报
回复
相信泽法大哥绝对没有错!顶^
hzjieking 2006-11-30
  • 打赏
  • 举报
回复
maozefa(阿发伯) 是GDI高手,相信他没错的!
阿发伯 2006-11-30
  • 打赏
  • 举报
回复

uses GDIPOBJ, GDIPAPI;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
g: TGpGraphics;
attr: TGPImageAttributes;
Image: TGpImage;
begin
g := TGpGraphics.Create(Handle, False);
Image := TGpBitmap.Create('e:\1.jpg');
attr := TGPImageAttributes.Create;
attr.SetOutputChannel(ColorChannelFlagsK);
g.DrawImage(Image, MakeRect(0, 0, Image.GetWidth, Image.GetHeight),
0, 0, Image.GetWidth, Image.GetHeight, UnitPixel, attr);
attr.Free;
g.Free;
Image.Free;
end;
51one 2006-11-30
  • 打赏
  • 举报
回复
我也想知道,期待高手出现。
Eddie005 2006-11-29
  • 打赏
  • 举报
回复
路过顶~~

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧