切割透明部分图像
Cut transparent parts image
更新后的图片:
非常感谢你,伙计,但我想做一些不同的事情,将这里的每个矩形单独切割 image.Lets 首先尝试找到蓝色块边界。听起来很难,其实很简单。
看看我到目前为止做了什么:
private unsafe Bitmap CodeImage(Bitmap bmp)
{
Bitmap bmpRes = new Bitmap(bmp.Width, bmp.Height);
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr scan0 = bmData.Scan0;
int stride = bmData.Stride;
int nWidth = bmp.Width;
int nHeight = bmp.Height;
int minX = 10000 ;
int maxX = -10000;
int minY = 10000;
var maxY = -10000;
bool found = false;
for (int y = 0; y < nHeight; y++)
{
byte* p = (byte*)scan0.ToPointer();
p += y * stride;
for (int x = 0; x < nWidth; x++)
{
if (p[3]!=0) //Check if pixel is transpert;
{
found = true;
if (x < minX)
minX = x;
if (y < minY)
minY = y;
if (x > maxX)
maxX = x;
if (y > maxY)
maxY = y;
}
else
{
if (found)
{
Rectangle temp = new Rectangle(minX, minY, maxX - minX, maxY-minY);
return bmp.Clone(temp, bmp.PixelFormat);
}
}
p += 4;
}
}
return null;
}
你实际上是在写,我应该这样计算宽度:
int width = maxX - minX;
它确实有效..但是高度是 0....
试试看它输出几乎正确的具有这些边界的矩形:
(200,800,400,高度为 0)。
我只是在我的算法中使用了你的部分代码,是的,你是对的,但现在高度有点问题,如果你能看一看,我将不胜感激
我将使用伪代码编写此代码,因为您随后应该能够将其应用于任何类型的图像或语言...
var minX = 10000
var maxX = -10000
var minY = 10000
var maxY = -10000
for (var y = 0 to height)
{
for (var x = 0 to width)
{
if (pixel(x,y).Color != transparent)
{
if (x < minX) minX = x
if (y < minY) minY = y
if (x > maxX) maxX = x
if (y > maxY) maxY = y
}
}
}
var cropRectangle = (minX, minY, maxX, maxY)
您现在可以在位图上使用标准函数来获取该区域,该区域应该是非透明像素所包围的区域。
更新后的图片:
非常感谢你,伙计,但我想做一些不同的事情,将这里的每个矩形单独切割 image.Lets 首先尝试找到蓝色块边界。听起来很难,其实很简单。
看看我到目前为止做了什么:
private unsafe Bitmap CodeImage(Bitmap bmp)
{
Bitmap bmpRes = new Bitmap(bmp.Width, bmp.Height);
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
IntPtr scan0 = bmData.Scan0;
int stride = bmData.Stride;
int nWidth = bmp.Width;
int nHeight = bmp.Height;
int minX = 10000 ;
int maxX = -10000;
int minY = 10000;
var maxY = -10000;
bool found = false;
for (int y = 0; y < nHeight; y++)
{
byte* p = (byte*)scan0.ToPointer();
p += y * stride;
for (int x = 0; x < nWidth; x++)
{
if (p[3]!=0) //Check if pixel is transpert;
{
found = true;
if (x < minX)
minX = x;
if (y < minY)
minY = y;
if (x > maxX)
maxX = x;
if (y > maxY)
maxY = y;
}
else
{
if (found)
{
Rectangle temp = new Rectangle(minX, minY, maxX - minX, maxY-minY);
return bmp.Clone(temp, bmp.PixelFormat);
}
}
p += 4;
}
}
return null;
}
你实际上是在写,我应该这样计算宽度:
int width = maxX - minX;
它确实有效..但是高度是 0....
试试看它输出几乎正确的具有这些边界的矩形: (200,800,400,高度为 0)。 我只是在我的算法中使用了你的部分代码,是的,你是对的,但现在高度有点问题,如果你能看一看,我将不胜感激
我将使用伪代码编写此代码,因为您随后应该能够将其应用于任何类型的图像或语言...
var minX = 10000
var maxX = -10000
var minY = 10000
var maxY = -10000
for (var y = 0 to height)
{
for (var x = 0 to width)
{
if (pixel(x,y).Color != transparent)
{
if (x < minX) minX = x
if (y < minY) minY = y
if (x > maxX) maxX = x
if (y > maxY) maxY = y
}
}
}
var cropRectangle = (minX, minY, maxX, maxY)
您现在可以在位图上使用标准函数来获取该区域,该区域应该是非透明像素所包围的区域。