none
확대했을경우 선명도 질문입니다 RRS feed

답변

  • ★확대를 안한상태에서 왼쪽버튼을 눌러움직일려고 할경우  에러가
    나옵니다. 해결이 안될까요?★

    ==> 데브피아에 답변 드렸던

    http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=147504&ref=147487&page=3#Contents147504

    여기 첨부드린 제 소스코드를 실행하시면 확대하지 않은 상태에서도 오류가 발생하지 않는데요. 지금은 오류 메세지도 모르는 상태라서 예상하기 어렵긴한데요.

                 else if (e.Button == MouseButtons.Left) //이미지 이동(추가)
                {
                    //imgRect.X = imgRect.X + (e.X - clickPoint.X);//이렇게 하면 이미지스크롤 속도가 너무 빠르므로 마우스 움직임에 나누기20 정도 해준다.
                    imgRect.X = imgRect.X + (int)Math.Round((double)(e.X - clickPoint.X)/(double)20);
                    if (imgRect.X >= 0) imgRect.X = 0;
                    if (Math.Abs(imgRect.X) >= Math.Abs(imgRect.Width - pictureBox1.Width)) imgRect.X = -(imgRect.Width - pictureBox1.Width);
                    imgRect.Y = imgRect.Y + (int)Math.Round((double)(e.Y - clickPoint.Y)/(double)20);
                    if (imgRect.Y >= 0) imgRect.Y = 0;
                    if (Math.Abs(imgRect.Y) >= Math.Abs(imgRect.Height - pictureBox1.Height)) imgRect.Y = -(imgRect.Height - pictureBox1.Height);
    
                    hScrollBar1.Value = Math.Abs(imgRect.X);
                    vScrollBar1.Value = Math.Abs(imgRect.Y);
                    label5.Text = string.Format("imgRect.X:{0}  imgRect.Y:{1}", imgRect.X, imgRect.Y);
                }

    오류가 발생하면 위 소스 부분에서 발생할텐데 진하게 표시된줄에 브레이크포인트를 걸고 디버깅을 해보시면될것 같습니다. 나누기 20하는데서 오류가 발생할 가능성이 있을듯하군요. 확대 안한상태에서는 이동이 안되게 하시면 될것 같은데요.

    else if (e.Button == MouseButtons.Left && ratio != 1 ) //이미지 이동(추가)
    이렇게 수정해보는것도 괜찮을것 같습니다.

    ★PS★
    1>그리고 오른쪽버튼을 눌렀을경우 십자가가 그려진 정가운데를 기점으로 선이
    그어지도록 할수 있을까요??

    ==> 오른쪽버튼 클릭시 clickPoint 를 십자가 그려진 정가운데 좌표로 설정(picturebox1.Width/2,picturebox1.Height/2)하시면될것 같습니다.(필요하다면 마우스 위치도 그쪽으로 이동하시구요. Cursor.Position 이용: 지난번에 답변드렸습니다.)

    2>확대해서 선을 그었을경우 선의 선명도가 떨어지는데..확대해서 선을 그었을경우에도, 선의 선명도가 안떨어지게할수있을까요?

    ==> 확대시 선명도를 보정하는것은 포토샵같은 툴에 쓰이는 고급기술인듯한데요. 어렵겠지만 원리를 말씀드리면 점두개를 확대한다고 가정하면  ( .. ) -----> ( .  . ) 이렇게 간격이 벌어지게 되므로 선명도가 떨어지는 것인데 ( .   . ) --> ( .... ) 이렇게 빈 부분에 추가로 같은색깔 점을 더 찍어주면 되는것입니다. 앞에 점의 Point와 뒤의 점의 Point를 집어넣으면 앞의점과 뒤의점의 Point사이를 계산( 넓이와 높이 나누기 2 ) 해서 그 사이에 점을 찍어주는 함수를 만들고 촘촘해질때까지(나눈 값이 1이될 때까지) 재귀호출을 하면서 채워서 그 Point를 리턴해주는 결과를 받아서 확대시 그려주면 될것 같습니다. (말로만 설명드려 죄송하긴한데요. 이것만 붙잡고 있을순 없으니...)

    3> 현재 사진을 저장하면 1장뿐이 저장이 안돼는데... 무한으로 사진을 저장하게 할수있을까요?

    ==> 저장하는 코드가 어떻게 되어 있는지 모르겠는데요. 저장하는 코드를 제대로 수정하시면 될것 같습니다. (이름을 다르게 하신건 맞죠?)

    image.Save("사진"+iCout.ToString()+".png", System.Drawing.Imaging.ImageFormat.Png);
    이런식이 되겠지요. iCount는 저장할때마다 증가시킨 int값이면 되겠죠.

    4> 키보드 버튼 X를 눌렀을경우 Undo기능을 추가하고싶습니다..

    ==> pointList, curveList 같은 포인트들을 가지고 있을 수 있는 배열을 마들어서 마우스가 클릭될때 clickPoint이외에 (int)clickCount 같은 변수를 만들어 증가시키면서 마우스가 Up될때 마다 배열 arrUndoCurveList[clickCount] 에다가 담아두시고 Undo했을때 curveList = arrUndoCurveList[--clickCount]; 이렇게 이전 저장해둔 경로를 다시 가져와서 그리면 될것 같습니다. (포토샵의 히스토리창 같은건 ListView 같은걸 사용하고 있는것 같습니다. 배열대신에 ++clickCount; ListView1.Items.Add( clickCount.ToString()+"번째 히스토리"); 이렇게 추가하시고 현재 ListView1.Items[ clickCount ].Tag = curveList; 이런식으로 Tag에 집어넣어서 이전걸 클릭시 curveList = ( List<List<Point>>)ListView1.Items[ clickCount-돌아갈순번 ].Tag;  이런식으로 Undo기능을 구현하셔도 될것 같습니다.)

    말로만 해드려서 죄송합니다만 저로서도 이론을 알고 있다하더라도 실제로 구현해보기 전까지는 잘 작동할지 알 수 없는 부분이네요. 초보분에게는 다소 어려움이 없지 않다고 생각되는 내용이네요. 열심히 구현해보시다가 어느정도 실체가 나오면 다시 한번 질문해 주세요.

    (이전 쓰셨던 게시물들 관련해서 답변 채택을 좀 부탁드립니다. 목록을 보면 계속 물음표(미결상태)로 떠 있는것 같습니다. 초록색 V표로 바뀌도록...)

    그럼.. ^^



    • 편집됨 GoldrushKoreaMVP 2012년 8월 7일 화요일 오전 4:53
    • 답변으로 표시됨 mataeo187 2012년 8월 7일 화요일 오전 4:59
    2012년 8월 7일 화요일 오전 4:43