java fillrect 填充图片_在8位图像上使用Graphics.FillRectangle方法

本文档介绍了一个在8位bmp位图上执行FillRectangle的方法,涉及颜色索引处理、调色板操作以及位图锁定和解锁。示例代码展示了如何填充不同颜色的矩形,并提出了一些潜在的改进点,如错误检查、颜色查找优化和透明度支持。
摘要由CSDN通过智能技术生成

这是一个在 bmp8bpp 位图上执行 FillRectangle 的例程 .

您传入一个索引,如果将使用正数将颜色放入调色板中 . 如果传入负索引,它将尝试找到颜色,如果找不到它,它会将颜色放在索引的末尾 . 这将覆盖之前的任何颜色!

void FillIndexedRectangle(Bitmap bmp8bpp, Rectangle rect, Color col, int index)

{

var pal = bmp8bpp.Palette;

int idx = -1;

if (index >= 0) idx = index;

else

{

if (pal.Entries.Where(x => x.ToArgb() == col.ToArgb()).Any())

idx = pal.Entries.ToList().FindIndex(x => x.ToArgb() == col.ToArgb());

if (idx < 0) idx = pal.Entries.Length - 1;

}

pal.Entries[idx] = col;

bmp8bpp.Palette = pal;

var bitmapData =

bmp8bpp.LockBits(new Rectangle(Point.Empty, bmp8bpp.Size),

ImageLockMode.ReadWrite, bmp8bpp.PixelFormat);

byte[] buffer=new byte[bmp8bpp.Width*bmp8bpp.Height];

Marshal.Copy(bitmapData.Scan0, buffer,0, buffer.Length);

for (int y = rect.Y; y < rect.Bottom; y++)

for (int x = rect.X; x < rect.Right; x++)

{

buffer[x + y * bmp8bpp.Width] = (byte)idx;

}

Marshal.Copy(buffer, 0, bitmapData.Scan0,buffer.Length);

bmp8bpp.UnlockBits(bitmapData);

}

示例调用:

Bitmap img = new Bitmap(200, 200, PixelFormat.Format8bppIndexed);

FillIndexedRectangle(img, new Rectangle(0,0,200, 200), Color.Silver, 21);

FillIndexedRectangle(img, new Rectangle(23, 23, 55, 99), Color.Red, 22);

FillIndexedRectangle(img, new Rectangle(123, 123, 55, 33), Color.Black, 23);

FillIndexedRectangle(img, new Rectangle(1, 1, 123, 22), Color.Orange, 34);

FillIndexedRectangle(img, new Rectangle(27, 27, 16, 12), Color.Black, -1);

img.Save("D:\\__bmp8bpp.png");

结果:

2b7223fd8ea2eb3189398191693ffc6d.png

还有改进的余地:

缺少lockbits中的所有错误检查,包括wrt pixelformat和rectangle data

使用更动态的方案添加颜色可能不错,而不是添加到最后

用于找到调色板中已有的最接近颜色的方案也可能很好

用透明度绘图的方案也很不错 . 为此,必须首先确定所有必要的新颜色;也是透明模式 .

也许应该返回方法中使用的 index ,以便下次调用可以引用它 .

对于除矩形以外的其他形状,可以使用复制例程,首先将它们绘制到“普通”32bpp位图上,然后将像素传输到缓冲区 .

Update: 这里有几行要添加(**)或更改(*)以允许绘制 unfilled 矩形; stroke 0 fills 矩形..:

void FillIndexedRectangle(Bitmap bmp8bpp, Rectangle rect,

Color col, int index, int stroke) // *

...

...

Marshal.Copy(bitmapData.Scan0, buffer,0, buffer.Length);

Rectangle ri = rect; //**

if (stroke > 0) ri.Inflate(-stroke, -stroke); //**

for (int y = rect.Y; y < rect.Bottom; y++)

for (int x = rect.X; x < rect.Right; x++)

{

if (ri == rect || !ri.Contains(x,y)) //**

buffer[x + y * bmp8bpp.Width] = (byte)idx;

}

Marshal.Copy(buffer, 0, bitmapData.Scan0,buffer.Length);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值