none
이미지 저장방법과 가운데고정 선그리기!! 질문입니다 RRS feed

답변

  • 안녕하세요. 고생 많으세요.

    우선 2가지 질문중에 첫번째것만 답변드리고 나머지는 여유시간에 해보고 답변드리도록 하겠습니다.

    위 저장하는 로직을 봤는데 count가 지역변수여서 클릭할때마다 다시 선언되어서 항상 0일것 같습니다.

    결론적으로 이름이 항상 동일하다는 말이죠.

            int imageCount=0;
            private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
            {
    
                if (e.Button == MouseButtons.Middle)
                {
                    /*
                    Image image = new Bitmap(pictureBox2.Width, pictureBox2.Height);
                    Graphics g = Graphics.FromImage(image);
                    g.Clear(Color.White);
                    foreach (List<Point> curve in curveList)
                    {
                        try
                        {
                            g.DrawLines(Pens.Black, curve.ToArray());
                        }
                        catch
                        {
                        }
                    }
                    image.Save("사진.png", System.Drawing.Imaging.ImageFormat.Png);
                    */
                    
                    ExportToBmp(pictureBox2,@"C:\temp\사진" + (++imageCount).ToString() + ".png");
    
                }
            }
    
            public void ExportToBmp(PictureBox pictureBox,string path)
            {
                using (var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
                {
                    pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
                    
                    System.Drawing.Imaging.ImageFormat imageFormat = null;
    
                    var extension = System.IO.Path.GetExtension(@path);
                    switch (extension.ToLower())
                    {
                        case ".bmp":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Bmp;
                            break;
                        case ".png":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Png;
                            break;
                        case ".jpeg":
                        case ".jpg":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Jpeg;
                            break;
                        case ".gif":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Gif;
                            break;
                        default:
                            throw new NotSupportedException("File extension is not supported");
                    }
    
                    bitmap.Save(@path, imageFormat);
                }
            } 

    이런식으로 해주시면 될것 같습니다.

    ^^


    • 답변으로 표시됨 mataeo187 2012년 8월 8일 수요일 오전 12:28
    • 편집됨 GoldrushKoreaMVP 2012년 8월 8일 수요일 오전 12:33
    2012년 8월 8일 수요일 오전 12:05

모든 응답

  • 안녕하세요. 고생 많으세요.

    우선 2가지 질문중에 첫번째것만 답변드리고 나머지는 여유시간에 해보고 답변드리도록 하겠습니다.

    위 저장하는 로직을 봤는데 count가 지역변수여서 클릭할때마다 다시 선언되어서 항상 0일것 같습니다.

    결론적으로 이름이 항상 동일하다는 말이죠.

            int imageCount=0;
            private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
            {
    
                if (e.Button == MouseButtons.Middle)
                {
                    /*
                    Image image = new Bitmap(pictureBox2.Width, pictureBox2.Height);
                    Graphics g = Graphics.FromImage(image);
                    g.Clear(Color.White);
                    foreach (List<Point> curve in curveList)
                    {
                        try
                        {
                            g.DrawLines(Pens.Black, curve.ToArray());
                        }
                        catch
                        {
                        }
                    }
                    image.Save("사진.png", System.Drawing.Imaging.ImageFormat.Png);
                    */
                    
                    ExportToBmp(pictureBox2,@"C:\temp\사진" + (++imageCount).ToString() + ".png");
    
                }
            }
    
            public void ExportToBmp(PictureBox pictureBox,string path)
            {
                using (var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
                {
                    pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
                    
                    System.Drawing.Imaging.ImageFormat imageFormat = null;
    
                    var extension = System.IO.Path.GetExtension(@path);
                    switch (extension.ToLower())
                    {
                        case ".bmp":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Bmp;
                            break;
                        case ".png":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Png;
                            break;
                        case ".jpeg":
                        case ".jpg":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Jpeg;
                            break;
                        case ".gif":
                            imageFormat = System.Drawing.Imaging.ImageFormat.Gif;
                            break;
                        default:
                            throw new NotSupportedException("File extension is not supported");
                    }
    
                    bitmap.Save(@path, imageFormat);
                }
            } 

    이런식으로 해주시면 될것 같습니다.

    ^^


    • 답변으로 표시됨 mataeo187 2012년 8월 8일 수요일 오전 12:28
    • 편집됨 GoldrushKoreaMVP 2012년 8월 8일 수요일 오전 12:33
    2012년 8월 8일 수요일 오전 12:05
  • 업무종료후에 해본다고 늦었네요. ^^

                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);
                    label3.Text = string.Format("imgRect.X:{0}  imgRect.Y:{1}", imgRect.X, imgRect.Y);
    
                    //이동시 가운데를 기점으로 라인그리기
                    LastPoint = new Point(
                                         (int)Math.Round((Math.Abs(imgRect.X) + (label2.Location.X - pictureBox1.Left)) / ratio),
                                         (int)Math.Round((Math.Abs(imgRect.Y) + (label1.Location.Y - pictureBox1.Top)) / ratio));
    
                    pointList.Add(LastPoint);
                    Draw();
                }
    

    기존 제가 드렸던 소스에서 pictureBox1_MouseMove 이벤트 내의 소스를 조금 수정했습니다.

    위 진하게 표시된 부분을 추가했는데요.

    원리는 십자가표시인 label1,lable2 가 지나간 지점들(괘적?)을 pointList에 추가하는 방법입니다.

    이미지상에서 가운데 십자가위치x = 이미지의 x + 라벨의 위치x - (폼의 0 지점 + pictureBox1의 시작점 x)

    인 원리입니다.

    테스트해보니 가운데 십자가가 이미지의 오른쪽 상단으로는 못가는 부분이 있어서 수정하셔야할 듯한데...

    십자가의 위치가 최소 imgRect의 (0,0) 위치까지는 와야할것 같고

    최대 imgRect의 (Width,Height) 까지만 움직이도록 바로의위 소스에서 if(imgRect.X<=0)....... 등등 조건을 수정하시면 될것 같은데...

    한번 연구해보시면 될것 같네요.

     

    2012년 8월 8일 수요일 오전 11:14