2012-12-13 2 views
1

이미지 데이터를 잘라낼 수 있습니다. 내가 알고있는 경우 :C#에서 이미지 데이터 잘라 내기

byte[] ImageData; 
int width; 
int height; 

는 기본적으로 나는 byte[] 소스에서 이미지의 내부 섹션을 얼마나 찾아보십시오.

예를 들어 나는 w : 1000px 및 h : 600px 인 이미지를 가지고 있습니다. 그리고 byte[] 중간 섹션 200 * 200px를 byte[]으로하고 싶습니다.

답변

2

먼저 당신은 당신의 배열의 바이트가 하나 개의 픽셀을 표현하는 방법을 알아야합니다. 다음은 픽셀 당 3 바이트의 RGB 이미지가 있다고 가정합니다.

그런 다음 절 결부의 왼쪽 상단을 나타내는 첫 번째 바이트의 배열 인덱스

y 컷 아웃의 y -coordinate이다
int i = y * w + x 

로 표현된다 w은의 폭 전체 이미지와 x은 컷 아웃의 좌표가 x입니다. 마지막 행에 대한 첫 번째에서

// cw: The width of the cutout 
// ch: The height of the cutout 
// x1/y1: Top-left corner coordinates 

byte[] cutout = new byte[cw * ch * 3]; // Byte array that takes the cutout bytes 
for (int cy = y1; cy < y2; cy++) 
{ 
    int i = cy * w + x1; 
    int dest = (cy - y1) * cw * 3; 
    Array.Copy(imagebytes, i, cutout, dest, cw * 3); 
} 

이 반복 잘라하는 다음과 같이

그렇다면, 당신은 할 수 있습니다. 그런 다음 i에서 이미지에서 잘라야 할 행의 첫 번째 바이트 인덱스를 계산합니다. dest에서 바이트를 복사해야하는 cutout의 색인을 계산합니다.

그 후 지정된 위치에 cutout으로 잘라내 진 현재 행의 바이트를 복사합니다.

이 코드를 테스트하지는 않았지만 실제로 작동해야합니다. 또한 현재 범위 검사는 없습니다. 따라서 컷 아웃의 위치와 크기가 실제로 이미지 범위 내에 있는지 확인해야합니다.

+0

고마워요,이게 내가 원하는거야. –

0

당신이 이미지를 처음으로 변환 할 수 있다면, 당신은 내가 Bytes.Com 다음 코드는 나를 위해 작동

에서 발견이 코드를 사용할 수 있습니다. .gif를로드하고 gif의 30 x 30 섹션을 오프 스크린 비트 맵에 그린 다음 축척 된 이미지를 그림 상자로 그립니다.

System.Drawing.Image img=... create the image from the bye array .... 
Graphics g1 = pictureBox1.CreateGraphics(); 
g1.DrawImage(img, 0, 0, img.Width, img.Height); 
g1.Dispose(); 

Graphics g3 = Graphics.FromImage(bmp); 
g3.DrawImageUnscaled(img, 0, 0, bmp.Width, bmp.Height); 

Graphics g2 = pictureBox2.CreateGraphics(); 
g2.DrawImageUnscaled(bmp, 0, 0, bmp.Width, bmp.Height); 
g2.Dispose(); 

g3.Dispose(); 
img.Dispose(); 

당신은 이미지로 바이트 []을 설정하는이 질문을 사용할 수 있습니다 : 모든 Convert a Byte array to Image in c# after modifying the array

+0

응답을 보내 주셔서 감사합니다. 불행히도 System.Drawing을 사용하지 않으려 고하므로 Thorsten-dittmar 솔루션을 사용합니다. 낮은 수준의 .net 라이브러리 만 사용하기 때문입니다. 하지만 다시 고마워요 –