다음 코드를 사용하여 이미지 주변의 공백을 제거하고 있습니다. 내가 비트 맵 트리밍으로 인해 아래쪽에있는 텍스트가 자르다
을 트리밍 한 후하지만 다음과 같은 결과를 얻을 트리밍 한 후 다음과 같이한다 좋았지 적절한 이미지에 그린 텍스트와 비트 맵을 손질하기 위해 노력하고있어static Bitmap TrimBitmap(Bitmap source)
{
Rectangle srcRect = default(Rectangle);
BitmapData data = null;
try
{
data = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
byte[] buffer = new byte[data.Height * data.Stride];
Marshal.Copy(data.Scan0, buffer, 0, buffer.Length);
int xMin = int.MaxValue,
xMax = int.MinValue,
yMin = int.MaxValue,
yMax = int.MinValue;
bool foundPixel = false;
// Find xMin
for (int x = 0; x < data.Width; x++)
{
bool stop = false;
for (int y = 0; y < data.Height; y++)
{
byte alpha = buffer[y * data.Stride + 4 * x + 3];
if (alpha != 0)
{
xMin = x;
stop = true;
foundPixel = true;
break;
}
}
if (stop)
break;
}
// Image is empty...
if (!foundPixel)
return null;
// Find yMin
for (int y = 0; y < data.Height; y++)
{
bool stop = false;
for (int x = xMin; x < data.Width; x++)
{
byte alpha = buffer[y * data.Stride + 4 * x + 3];
if (alpha != 0)
{
yMin = y;
stop = true;
break;
}
}
if (stop)
break;
}
// Find xMax
for (int x = data.Width - 1; x >= xMin; x--)
{
bool stop = false;
for (int y = yMin; y < data.Height; y++)
{
byte alpha = buffer[y * data.Stride + 4 * x + 3];
if (alpha != 0)
{
xMax = x;
stop = true;
break;
}
}
if (stop)
break;
}
// Find yMax
for (int y = data.Height - 1; y >= yMin; y--)
{
bool stop = false;
for (int x = xMin; x <= xMax; x++)
{
byte alpha = buffer[y * data.Stride + 4 * x + 3];
if (alpha != 0)
{
yMax = y;
stop = true;
break;
}
}
if (stop)
break;
}
srcRect = Rectangle.FromLTRB(xMin, yMin, xMax , yMax);
}
finally
{
if (data != null)
source.UnlockBits(data);
}
Bitmap dest = new Bitmap(srcRect.Width, srcRect.Height);
Rectangle destRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height);
using (Graphics graphics = Graphics.FromImage(dest))
{
graphics.DrawImage(source, destRect, srcRect, GraphicsUnit.Pixel);
}
return dest;
}
용맹 한 바닥 부분 잘림
내가 뭘 잘못하고 있니? 조언을 바랍니다 ..
당신이 보여주는 이미지가 저를 혼란스럽게합니다. 알파 == 0은 어디에 있습니까? 그리고 결과는 어느 부분입니까? thw 빨간색 상자 안에 그냥 부분 ?? 당신은 a == 0 또는 == 255 인 날카로운 경계를 가정하고 반투명 한 픽셀을 가지고 있다고 가정합니다. 이미지에서 알기 힘듭니다. 어쩌면 문턱 값은 0을 테스트하는 것보다 더 잘 작동합니다. – TaW
@TaW 아래쪽의 텍스트를 자르려면 빨간색 상자를 그립니다. 예를 들어 첫 번째와 두 번째 이미지의 's'를 비교합니다. 플러스 이 텍스트를 별도의 이미지 ('새로운 비트 맵 (somewidth, someheight)')에 그리 고 다른 이미지 위에 텍스트 비트 맵을 그립니다. – techno
@TaW 흠 .. 알았어. 코드를 업데이트하고 나 한테 대답 해 주시겠습니까? – techno