728x90
반응형
728x170
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
#region 메모리 설정하기 - memset(targetPointer, fillerValue, count)
/// <summary>
/// 메모리 설정하기
/// </summary>
/// <param name="targetPointer">목표 주소</param>
/// <param name="fillerValue">채우기 값</param>
/// <param name="count">수</param>
/// <returns>목표 주소</returns>
[DllImport("ntdll.dll")]
public static extern unsafe byte * memset(byte* targetPointer, int fillerValue, int count);
#endregion
#region 사각형 그리기 - DrawRectangle(sourceBitmapData, rectangle, color)
/// <summary>
/// 사각형 그리기
/// </summary>
/// <param name="sourceBitmapData">대상 비트맵 데이타</param>
/// <param name="rectangle">사각형</param>
/// <param name="color">색상</param>
/// <remarks>소스 비트맵 데이타 픽셀 형식은 24비트 색상 또는 256 인덱스 색상이어야 합니다.</remarks>
public void DrawRectangle(BitmapData sourceBitmapData, Rectangle rectangle, Color color)
{
int bitmapWidth = sourceBitmapData.Width;
int bitmapHeight = sourceBitmapData.Height;
int stride = sourceBitmapData.Stride;
int rectangleX1 = rectangle.X;
int rectangleY1 = rectangle.Y;
int rectangleX2 = rectangle.X + rectangle.Width - 1;
int rectangleY2 = rectangle.Y + rectangle.Height - 1;
if((rectangleX1 >= bitmapWidth) || (rectangleY1 >= bitmapHeight) || (rectangleX2 < 0) || (rectangleY2 < 0))
{
return;
}
int startX = Math.Max(0, rectangleX1);
int endX = Math.Min(bitmapWidth - 1, rectangleX2);
int startY = Math.Max(0, rectangleY1);
int endY = Math.Min(bitmapHeight - 1, rectangleY2);
unsafe
{
if(sourceBitmapData.PixelFormat == PixelFormat.Format8bppIndexed)
{
byte gray = (byte)(0.2125d * color.R + 0.7154d * color.G + 0.0721d * color.B);
if(rectangleY1 >= 0)
{
byte* sourcePointer = (byte*)sourceBitmapData.Scan0.ToPointer() + rectangleY1 * stride + startX;
memset(sourcePointer, gray, endX - startX);
}
if(rectangleY2 < bitmapHeight)
{
byte* sourcePointer = (byte*)sourceBitmapData.Scan0.ToPointer() + rectangleY2 * stride + startX ;
memset(sourcePointer, gray, endX - startX);
}
if(rectangleX1 >= 0)
{
byte* sourcePointer = (byte*)sourceBitmapData.Scan0.ToPointer() + startY * stride + rectangleX1;
for(int y = startY; y <= endY; y++, sourcePointer += stride)
{
*sourcePointer = gray;
}
}
if(rectangleX2 < bitmapWidth)
{
byte* sourcePointer = (byte*)sourceBitmapData.Scan0.ToPointer() + startY * stride + rectangleX2;
for(int y = startY; y <= endY; y++, sourcePointer += stride)
{
*sourcePointer = gray;
}
}
}
else
{
byte red = color.R;
byte green = color.G;
byte blue = color.B;
if(rectangleY1 >= 0)
{
byte* sourcePointer = (byte*) sourceBitmapData.Scan0.ToPointer() + rectangleY1 * stride + startX * 3;
for(int x = startX; x <= endX; x++, sourcePointer += 3)
{
sourcePointer[2] = red;
sourcePointer[1] = green;
sourcePointer[0] = blue;
}
}
if(rectangleY2 < bitmapHeight)
{
byte* sourcePointer = (byte*) sourceBitmapData.Scan0.ToPointer() + rectangleY2 * stride + startX * 3;
for(int x = startX; x <= endX; x++, sourcePointer += 3)
{
sourcePointer[2] = red;
sourcePointer[1] = green;
sourcePointer[0] = blue;
}
}
if(rectangleX1 >= 0)
{
byte* sourcePointer = (byte*) sourceBitmapData.Scan0.ToPointer() + startY * stride + rectangleX1 * 3;
for(int y = startY; y <= endY; y++, sourcePointer += stride)
{
sourcePointer[2] = red;
sourcePointer[1] = green;
sourcePointer[0] = blue;
}
}
if(rectangleX2 < bitmapWidth)
{
byte* sourcePointer = (byte*) sourceBitmapData.Scan0.ToPointer() + startY * stride + rectangleX2 * 3;
for(int y = startY; y <= endY; y++, sourcePointer += stride)
{
sourcePointer[2] = red;
sourcePointer[1] = green;
sourcePointer[0] = blue;
}
}
}
}
}
#endregion
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] 폰트 패밀리 구하기 (0) | 2015.02.01 |
---|---|
[C#/WINFORM] 다각형 그리기 (0) | 2015.02.01 |
[C#/WINFORM] 선 그리기 (0) | 2015.02.01 |
[C#/WINFORM] 라운드 사각형 칠하기 (0) | 2015.02.01 |
[C#/WINFORM] 라운드 사각형 그리기 (0) | 2015.02.01 |
[C#/WINFORM] 사각형 칠하기 (0) | 2015.02.01 |
[C#/WINFORM] 원에서 특정 각도 포인트 구하기 (0) | 2015.01.31 |
[C#/WINFORM] 범위 색상 구하기 (0) | 2015.01.31 |
[C#/WINFORM] 비슷한 색상 구하기 (0) | 2015.01.31 |
[C#/WINFORM] 16진수 색상 코드 구하기 (0) | 2015.01.31 |
댓글을 달아 주세요