如何根据png格式文件生成不规则窗体 ( 积分: 200 )

  • 主题发起人 主题发起人 seeinrain
  • 开始时间 开始时间
S

seeinrain

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,不要告诉我用bmp或jpg格式的图片生成不规则窗体。我用以下方法总是不完美
procedure TForm1.FormCreate(Sender: TObject);
var
Png: TPngObject;
Rect: TRect;
Rgn: HRGN;
begin
Png := TPngObject.Create;
Png.LoadFromFile('bg.png');
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := Rect.Left + Png.Width;
Rect.Bottom := Rect.Top + Png.Height;
c_W := Png.Width;
c_H := Png.Height;
Png.Draw(Image1.Canvas, Rect);
Png.Free;

Width := c_W;
Height := c_H;
//GetValue;

Rgn := CreateRegion;
if Rgn <> 0 then
begin
SetWindowRgn(Handle, Rgn, True);
end;
end;


function TForm1.CreateRegion: HRGN;
var
Rgn, TempRgn: HRGN;
X, Y, BeginY: Integer;
Line: Boolean;
Color, wColor: TColor;
begin
wColor := 16777215;
BeginY := 0;
Rgn := CreateRectRgn(0, 0, 0, 0);
for X := 0 to c_W - 1 do
begin
Line := False;
for Y := 0 to c_H - 1 do
begin
Color := Image1.Canvas.Pixels[X, Y];
if not (Color = wColor) then
begin
if not Line then
begin
Line := True;
BeginY:= Y;
end;
end;
if (Color = wColor) or (Y = c_H - 1) then
begin
if Line then
begin
Line := False;
TempRgn := CreateRectRgn(X, BeginY, X + 1, Y);
CombineRgn(Rgn, Rgn, TempRgn, RGN_OR);
end;
end;
end;
end;
Result := Rgn;
end;
 
如题,不要告诉我用bmp或jpg格式的图片生成不规则窗体。我用以下方法总是不完美
procedure TForm1.FormCreate(Sender: TObject);
var
Png: TPngObject;
Rect: TRect;
Rgn: HRGN;
begin
Png := TPngObject.Create;
Png.LoadFromFile('bg.png');
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := Rect.Left + Png.Width;
Rect.Bottom := Rect.Top + Png.Height;
c_W := Png.Width;
c_H := Png.Height;
Png.Draw(Image1.Canvas, Rect);
Png.Free;

Width := c_W;
Height := c_H;
//GetValue;

Rgn := CreateRegion;
if Rgn <> 0 then
begin
SetWindowRgn(Handle, Rgn, True);
end;
end;


function TForm1.CreateRegion: HRGN;
var
Rgn, TempRgn: HRGN;
X, Y, BeginY: Integer;
Line: Boolean;
Color, wColor: TColor;
begin
wColor := 16777215;
BeginY := 0;
Rgn := CreateRectRgn(0, 0, 0, 0);
for X := 0 to c_W - 1 do
begin
Line := False;
for Y := 0 to c_H - 1 do
begin
Color := Image1.Canvas.Pixels[X, Y];
if not (Color = wColor) then
begin
if not Line then
begin
Line := True;
BeginY:= Y;
end;
end;
if (Color = wColor) or (Y = c_H - 1) then
begin
if Line then
begin
Line := False;
TempRgn := CreateRectRgn(X, BeginY, X + 1, Y);
CombineRgn(Rgn, Rgn, TempRgn, RGN_OR);
end;
end;
end;
end;
Result := Rgn;
end;
 
不规则窗体的实现需要一个二色的bmp
Png.Draw(Image1.Canvas, Rect);其实也就是把PNG转化成为了DDB
你所说得不完美指不改透的地方透了?那可能是你的转化部分不是很清晰。
1.wColor := 16777215;这个是不透明色?[if (Color = wColor) or (Y = c_H - 1) then]
一般应该是透明色为单独或小范围的颜色,并且Png.Draw的时候,也没有清画布的代码.
你需要仔细考虑一下,精确调整你的代码(也包括性能,比如你的两个Color = wColor),你的思路其实是没问题的.
 
不完美指有些透的地方没有透。16777215;这个是不透明色
 
我以前倒也写了个这样的代码,你的代码是纵向扫描,按线矩形合并区域,
问题在只计算了线区的起始位置,当然会漏掉很多东西,比如中间的、末尾的等等

我找一下以前写的代码,找到后贴出来供你参考
 
我扫描是没错误的,只是这个TPngObject显示图片时有问题,有没有更好的控件
 
上次看的粗心了,呵呵

 Image1.Refresh; 是不是少了一个这个,
或者 Image1.Picture.Assign(Png);
参考http://www.pconline.com.cn/pcedu/empolder/gj/delphi/0412/525206_1.html
 
png格式的文件是否仅仅是比24bit的bmp多了一个字节的alpha通道?
如果这样的话,那也可以直接从这个文件来生成区域,没必要这么转换一下,呵呵,随便说说,不知道可行否
 
//来自:dawnsong
//仅仅是比24bit的bmp多了一个字节的alpha通道
这个是32bit的BMP(DIB).PNG是压缩的,因此在操作中必然有一个转换为DIB/DDB的过程
 
多谢zjan521高手指点,呵呵,给我澄清了一个概念,发现偶书读的少了,惭愧中...
 
png和bmp有什么区别吗?干吗非要用png的?用bmp又简单又容易。
 
PNG对图像进行了压缩.对于很多图片,PNG的压缩效果和质量都是很不错的,当然,他也有其不足.而利用PNG做不规则窗体的时候,因为其必须显式或隐式的转化为BMP(DIB/DDB),这就涉及到解压缩.PNG我的印象好像也是有损压缩的吧.这样的话解压的时候是不能完全复原的.因此就有可能出现一些地方的变质问题.所以相对而言,还是选择黑白的BMP作这件事情比较好.图片也不会太大.PNG好像只能做彩色的压缩.
 
后退
顶部