c # Bitmap.Save В приложении GDI + windows произошла общая ошибка - PullRequest
1 голос
/ 12 апреля 2011

Я делаю приложение OCR. У меня есть эта ошибка, когда я запускаю систему, в которой система сохранит изображение picturebox3.image в папку.

//When user is selecting, RegionSelect = true
    private bool RegionSelect = false;
    private int x0, x1, y0, y1;
    private Bitmap bmpImage;

private void loadImageBT_Click(object sender, EventArgs e)
{
    try
    {
        OpenFileDialog open = new OpenFileDialog();
        open.InitialDirectory = @"C:\Users\Shen\Desktop";

        open.Filter = "Image Files(*.jpg; *.jpeg)|*.jpg; *.jpeg";

        if (open.ShowDialog() == DialogResult.OK)
        {
            singleFileInfo = new FileInfo(open.FileName);
            string dirName = System.IO.Path.GetDirectoryName(open.FileName);
            loadTB.Text = open.FileName;
            pictureBox1.Image = new Bitmap(open.FileName);
            bmpImage = new Bitmap(pictureBox1.Image);
        }

    }
    catch (Exception)
    {
        throw new ApplicationException("Failed loading image");
    }
}

//User image selection Start Point
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    RegionSelect = true;

    //Save the start point.
    x0 = e.X;
    y0 = e.Y;
}

//User select image progress
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    //Do nothing it we're not selecting an area.
    if (!RegionSelect) return;

    //Save the new point.
    x1 = e.X;
    y1 = e.Y;

    //Make a Bitmap to display the selection rectangle.
    Bitmap bm = new Bitmap(bmpImage);


    //Draw the rectangle in the image.
    using (Graphics g = Graphics.FromImage(bm))
    {
        g.DrawRectangle(Pens.Red, Math.Min(x0, x1), Math.Min(y0, y1), Math.Abs(x1 - x0), Math.Abs(y1 - y0));
    }

    //Temporary display the image.
    pictureBox1.Image = bm;
}

//Image Selection End Point
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Do nothing it we're not selecting an area.
    if (!RegionSelect) return;
    RegionSelect = false;

    //Display the original image.
    pictureBox1.Image = bmpImage;

    // Copy the selected part of the image.
    int wid = Math.Abs(x0 - x1);
    int hgt = Math.Abs(y0 - y1);
    if ((wid < 1) || (hgt < 1)) return;

    Bitmap area = new Bitmap(wid, hgt);
    using (Graphics g = Graphics.FromImage(area))
    {
        Rectangle source_rectangle = new Rectangle(Math.Min(x0, x1), Math.Min(y0, y1), wid, hgt);
        Rectangle dest_rectangle = new Rectangle(0, 0, wid, hgt);
        g.DrawImage(bmpImage, dest_rectangle, source_rectangle, GraphicsUnit.Pixel);
    }

    // Display the result.
    pictureBox3.Image = area;


    ** ERROR occuer here!!!!!**
    area.Save(@"C:\Users\Shen\Desktop\LenzOCR\TempFolder\tempPic.jpg"); // error line occcur

    singleFileInfo = new FileInfo("C:\\Users\\Shen\\Desktop\\LenzOCR\\TempFolder\\tempPic.jpg");
}


       private void ScanBT_Click(object sender, EventArgs e)
{
    var folder = @"C:\Users\Shen\Desktop\LenzOCR\LenzOCR\WindowsFormsApplication1\ImageFile";

    DirectoryInfo directoryInfo;
    FileInfo[] files;
    directoryInfo = new DirectoryInfo(folder);
    files = directoryInfo.GetFiles("*.jpg", SearchOption.AllDirectories);

    var processImagesDelegate = new ProcessImagesDelegate(ProcessImages2);
    processImagesDelegate.BeginInvoke(files, null, null);     

    //BackgroundWorker bw = new BackgroundWorker();
    //bw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
    //bw.RunWorkerAsync(bw);
    //bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}

private void ProcessImages2(FileInfo[] files)
{
    var comparableImages = new List<ComparableImage>();

    var index = 0x0;

    foreach (var file in files)
    {
        if (exit)
        {
            return;
        }

        var comparableImage = new ComparableImage(file);
        comparableImages.Add(comparableImage);
        index++;
    }

    index = 0;

    similarityImagesSorted = new List<SimilarityImages>();
    var fileImage = new ComparableImage(singleFileInfo);

    for (var i = 0; i < comparableImages.Count; i++)
    {
        if (exit)
            return;

        var destination = comparableImages[i];
        var similarity = fileImage.CalculateSimilarity(destination);
        var sim = new SimilarityImages(fileImage, destination, similarity);
        similarityImagesSorted.Add(sim);
        index++;
    }

    similarityImagesSorted.Sort();
    similarityImagesSorted.Reverse();
    similarityImages = new BindingList<SimilarityImages>(similarityImagesSorted);

    var buttons =
        new List<Button>
            {
                ScanBT
            };

    if (similarityImages[0].Similarity > 70)
    {
        con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = "Data Source=SHEN-PC\\SQLEXPRESS;Initial Catalog=CharacterImage;Integrated Security=True";
        con.Open();

        String getFile = "SELECT ImageName, Character FROM CharacterImage WHERE ImageName='" + similarityImages[0].Destination.ToString() + "'";
        SqlCommand cmd2 = new SqlCommand(getFile, con);
        SqlDataReader rd2 = cmd2.ExecuteReader();

        while (rd2.Read())
        {
            for (int i = 0; i < 1; i++)
            {
                string getText = rd2["Character"].ToString();
                Action showText = () => ocrTB.AppendText(getText);
                ocrTB.Invoke(showText);
            }
        }
        con.Close();
    }
    else
    {
        MessageBox.Show("No character found!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

}
#endregion

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Поскольку прошло много времени, я надеюсь, что вы нашли свой ответ, но я собираюсь догадаться, что вам нужно было установить формат файла при сохранении JPEG:

area.Save(@"C:\Users\Shen\Desktop\LenzOCR\TempFolder\tempPic.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);

Помимо этого, я не могу вспомнить, является ли элемент управления Picturebox двойным буфером или нет, что может быть проблемой (если это не так, вы не сможете получить к нему доступ для сохранения во время визуализации, но если вы сделаетекопия области перед установкой свойства picturebox3.Image, которое решит эту проблему):

Bitmap SavingObject=new Bitmap(area);
picturebox3.Image=area;
SavingObject.Save(@"C:\Users\Shen\Desktop\LenzOCR\TempFolder\tempPic.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);

В любом случае, я надеюсь, что вы в конечном итоге нашли свое решение (учитывая, что прошло уже несколько месяцев с момента его публикации).

0 голосов
/ 18 ноября 2013

Это похоже на копию этого вопроса: c # В GDI произошла общая ошибка +

Тот же код, та же ошибка, тот же автор.

Не вижулюбая разница.Но, может быть, я что-то упускаю.

...