i have canvas (which contain image) on apply layouttransform (scaletransform). draw rectangle on canvas (this rectangle used define export area in image format). find coordinates of rectangle relative canvas. in fact, scaletransforme used zoom. make bitmap of export area without taking in charge zoom (keeping original quality (resolution) of image in canvas).
xaml :
<grid> <canvas x:name="exportareacanvas" panel.zindex="9999" horizontalalignment="stretch" verticalalignment="stretch"> <rectangle stroke="black" strokethickness="2" x:name="exportarearectangle"/> </canvas> <canvas x:name="zoomcontrol" horizontalalignment="center" verticalalignment="center"> <canvas.layouttransform> <scaletransform scalex="{binding currentzoom}" scaley="{binding currentzoom}" centerx="0.5" centery="0.5"/> </canvas.layouttransform> <image x:name="imagetoexport" source="mysource"/> <canvas> c# :
private rendertargetbitmap getzoneasbitmap() { rect zonetoexport = new rect(canvas.getleft(exportarearectangle), canvas.gettop(exportarearectangle), exportarearectangle.width, exportarearectangle.height); point p1 = exportareacanvas.translatepoint(new point(zone.x, zone.y), zoomcontrol); point p2 = exportareacanvas.translatepoint(new point(zone.width, zone.height), zoomcontrol); rect zonetoexportfinal = new rect(p1, new size(p2.x, p2.y)); visualbrush sourcebrush = new visualbrush(); sourcebrush.visual = imagetoexport; sourcebrush.stretch = stretch.fill; sourcebrush.viewbox = zonetoexportfinal; sourcebrush.viewboxunits = brushmappingmode.absolute; drawingvisual drawingvisual = new drawingvisual(); using (drawingcontext drawingcontext = drawingvisual.renderopen()) { drawingcontext.drawrectangle(sourcebrush, null, zonetoexportfinal); drawingcontext.close(); } rendertargetbitmap rendertarget = new rendertargetbitmap((int)zonetoexportfinal.width, (int)zonetoexportfinal.height, 96, 96, pixelformats.default); rendertarget.render(drawingvisual); return rendertarget; } the final image doesn't correspond area @ all.
Comments
Post a Comment