ocr - c# A generic error occurred in GDI+ -
i have problem when drag select region of image in picturebox more 2 times , run scanning. ocr system.
region ocr(tab4_component)
//when user 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 start point. x0 = e.x; y0 = e.y; } //user select image progress private void picturebox1_mousemove(object sender, mouseeventargs e) { //do nothing we're not selecting area. if (!regionselect) return; //save new point. x1 = e.x; y1 = e.y; //make bitmap display selection rectangle. bitmap bm = new bitmap(bmpimage); //draw rectangle in 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 image. picturebox1.image = bm; } //image selection end point private void picturebox1_mouseup(object sender, mouseeventargs e) { // nothing we're not selecting area. if (!regionselect) return; regionselect = false; //display original image. picturebox1.image = bmpimage; // copy selected part of 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 result. picturebox3.image = area; area.save(@"c:\users\shen\desktop\lenzocr\tempfolder\temppic.jpg"); 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); (var = 0; < 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 characterimage imagename='" + similarityimages[0].destination.tostring() + "'"; sqlcommand cmd2 = new sqlcommand(getfile, con); sqldatareader rd2 = cmd2.executereader(); while (rd2.read()) { (int = 0; < 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 i understand reason occur image has been duplicated. have no idea how solve it.
first off looks dublicate of topic: c# bitmap.save generic error occurred in gdi+ windows application
you authored question. can tell it's same question regarding same code.
you mention happens second time select area, , both time save image same path. errors occurs when saving.
i think strong indication of permission error. have tried saving new file name every time test?
if it's permission error need dispose of resources have taken lock on file.
there plenty of examples of out there: http://www.kerrywong.com/2007/11/15/understanding-a-generic-error-occurred-in-gdi-error/
public void method1() { image img = image.fromfile(filename); bitmap bmp = img bitmap; graphics g = graphics.fromimage(bmp); bitmap bmpnew = new bitmap(bmp); g.drawimage(bmpnew, new point(0, 0)); g.dispose(); bmp.dispose(); img.dispose(); //code manipulate bmpnew goes here. bmpnew.save(filename); } there other issues. if image stream, stream needs remain open until you're done image. (when dispose of image you'll automatically dispose of stream.) can't see in code you've posted though.
if using 3rd party library ocr part, have taken lock on resource.
a place read here: http://support.microsoft.com/?id=814675
however you've said sounds there's lock on file try save to. so mentioned above start off trying give file new name each time. if doesn't work can start exploring other possibilities.
quick , dirty example:
area.save(@"c:\users\shen\desktop\lenzocr\tempfolder\temppic-" + guid.newguid().tostring() + @".jpg"); you should try before dismissing permission issue.
Comments
Post a Comment