package com.akjava.gwt.lib.client; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import java.util.List; import javax.annotation.Nullable; import com.akjava.gwt.html5.client.download.HTML5Download; import com.akjava.gwt.html5.client.file.Uint8Array; import com.akjava.gwt.lib.client.experimental.ImageDataUtils; import com.akjava.gwt.lib.client.game.PointXY; import com.akjava.lib.common.graphics.IntRect; import com.akjava.lib.common.graphics.Point; import com.google.gwt.canvas.client.Canvas; import com.google.gwt.canvas.dom.client.Context2d; import com.google.gwt.canvas.dom.client.ImageData; import com.google.gwt.dom.client.CanvasElement; import com.google.gwt.dom.client.ImageElement; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Image; public class CanvasUtils { public static Canvas createCanvas(Canvas canvas,int w,int h){ if(canvas!=null){ canvas.setCoordinateSpaceWidth(w); canvas.setCoordinateSpaceHeight(h); canvas.setWidth(w+"px"); canvas.setHeight(h+"px"); }else{ return createCanvas(w,h); } return canvas; } public static Canvas setCoordinateSpace(Canvas canvas,int w,int h){ if(canvas!=null){ canvas.setCoordinateSpaceWidth(w); canvas.setCoordinateSpaceHeight(h); } return canvas; } public static Canvas setSizeCanvas(Canvas canvas,int w,int h){ if(canvas!=null){ canvas.setWidth(w+"px"); canvas.setHeight(h+"px"); } return canvas; } /* * convert int */ public static Canvas createCanvas(double w,double h){ return createCanvas((int)w,(int)h); } public static Canvas createFrom(ImageData imageData){ checkNotNull(imageData,"createFrom:need imageData"); Canvas canvas=CanvasUtils.createCanvas(imageData.getWidth(), imageData.getHeight()); canvas.getContext2d().putImageData(imageData, 0, 0); return canvas; } public static Canvas createCanvas(int w,int h){ Canvas canvas=Canvas.createIfSupported(); return createCanvas(canvas,w,h); } public static void clip(Canvas canvas,int x,int y,int width,int height){ canvas.getContext2d().beginPath(); canvas.getContext2d().moveTo(x,y); canvas.getContext2d().lineTo(x+width,y); canvas.getContext2d().lineTo(x+width,y+height); canvas.getContext2d().lineTo(x,y+height); canvas.getContext2d().clip(); } public static String toDataUrl(Canvas canvas,Canvas useCanvas,int x,int y,int width,int height){ ImageData data=canvas.getContext2d().getImageData(x, y, width, height); if(useCanvas==null){ useCanvas=Canvas.createIfSupported(); } copyTo(data, useCanvas); return useCanvas.toDataUrl(); } public static Canvas createCanvas(Canvas canvas,ImageData data){ if(canvas==null){ canvas=Canvas.createIfSupported(); } canvas.setCoordinateSpaceWidth(data.getWidth()); canvas.setCoordinateSpaceHeight(data.getHeight()); canvas.getContext2d().putImageData(data, 0, 0); return canvas; } public static void disableSelection(Canvas canvas){ GWTHTMLUtils.disableSelectionStart(canvas.getCanvasElement()); } public static void drawCenter(Canvas canvas,ImageElement image,int offsetX,int offsetY,double scaleX,double scaleY,double angle,double alpha){ canvas.getContext2d().save(); double rx=(canvas.getCoordinateSpaceWidth())/2; double ry=(canvas.getCoordinateSpaceHeight())/2; canvas.getContext2d().translate(rx,ry);//rotate center double rotate=(Math.PI / 180)*angle; canvas.getContext2d().rotate(rotate); canvas.getContext2d().translate(-rx,-ry);//and back canvas.getContext2d().scale(scaleX,scaleY); double px=(canvas.getCoordinateSpaceWidth()/scaleX-image.getWidth())/2; double py=(canvas.getCoordinateSpaceHeight()/scaleY-image.getHeight())/2; //LogUtils.log("w="+canvas.getCoordinateSpaceWidth()+",scaled="+(element.getWidth()*scale)); //LogUtils.log("scale:"+scale+",x="+px+",y="+py); int ox=(int) (offsetX/scaleX); int oy=(int) (offsetY/scaleY); //canvas.getContext2d().rotate(-rotate); double x=ox; double y=oy; //offset is effect on angle,but scroll no need do it double nx = px+x * Math.cos(-rotate) - y * Math.sin(-rotate); double ny = py+x * Math.sin(-rotate) + y * Math.cos(-rotate); canvas.getContext2d().translate(nx,ny); canvas.getContext2d().setGlobalAlpha(alpha); canvas.getContext2d().drawImage(image, 0,0); canvas.getContext2d().restore(); } public static void drawCenter(Canvas canvas,ImageElement image,double offsetX,double offsetY,double scaleX,double scaleY,double angle,double alpha){ canvas.getContext2d().save(); double rx=(canvas.getCoordinateSpaceWidth())/2; double ry=(canvas.getCoordinateSpaceHeight())/2; canvas.getContext2d().translate(rx,ry);//rotate center double rotate=(Math.PI / 180)*angle; canvas.getContext2d().rotate(rotate); canvas.getContext2d().translate(-rx,-ry);//and back canvas.getContext2d().scale(scaleX,scaleY); double px=(canvas.getCoordinateSpaceWidth()/scaleX-image.getWidth())/2; double py=(canvas.getCoordinateSpaceHeight()/scaleY-image.getHeight())/2; //LogUtils.log("w="+canvas.getCoordinateSpaceWidth()+",scaled="+(element.getWidth()*scale)); //LogUtils.log("scale:"+scale+",x="+px+",y="+py); int ox=(int) (offsetX/scaleX); int oy=(int) (offsetY/scaleY); //canvas.getContext2d().rotate(-rotate); double x=ox; double y=oy; //offset is effect on angle,but scroll no need do it double nx = px+x * Math.cos(-rotate) - y * Math.sin(-rotate); double ny = py+x * Math.sin(-rotate) + y * Math.cos(-rotate); canvas.getContext2d().translate(nx,ny); canvas.getContext2d().setGlobalAlpha(alpha); canvas.getContext2d().drawImage(image, 0,0); canvas.getContext2d().restore(); } public static void drawCenter(Canvas canvas,CanvasElement canvasImage,double offsetX,double offsetY,double scaleX,double scaleY,double angle,double alpha){ canvas.getContext2d().save(); double rx=(canvas.getCoordinateSpaceWidth())/2; double ry=(canvas.getCoordinateSpaceHeight())/2; canvas.getContext2d().translate(rx,ry);//rotate center double rotate=(Math.PI / 180)*angle; canvas.getContext2d().rotate(rotate); canvas.getContext2d().translate(-rx,-ry);//and back canvas.getContext2d().scale(scaleX,scaleY); double px=(canvas.getCoordinateSpaceWidth()/scaleX-canvasImage.getWidth())/2; double py=(canvas.getCoordinateSpaceHeight()/scaleY-canvasImage.getHeight())/2; //LogUtils.log("w="+canvas.getCoordinateSpaceWidth()+",scaled="+(element.getWidth()*scale)); //LogUtils.log("scale:"+scale+",x="+px+",y="+py); int ox=(int) (offsetX/scaleX); int oy=(int) (offsetY/scaleY); //canvas.getContext2d().rotate(-rotate); double x=ox; double y=oy; //offset is effect on angle,but scroll no need do it double nx = px+x * Math.cos(-rotate) - y * Math.sin(-rotate); double ny = py+x * Math.sin(-rotate) + y * Math.cos(-rotate); canvas.getContext2d().translate(nx,ny); canvas.getContext2d().setGlobalAlpha(alpha); canvas.getContext2d().drawImage(canvasImage, 0,0); canvas.getContext2d().restore(); } /* * if you need use ImageElementLoader */ public static ImageElement toImageElement(Canvas canvas){ Image img=new Image(canvas.toDataUrl()); ImageElement imageElement=ImageElement.as(img.getElement()); return imageElement; } public static void clear(Canvas canvas){ canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); } public static void fillRect(Canvas canvas,String style){ canvas.getContext2d().setFillStyle(style); canvas.getContext2d().fillRect(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); } public static String createColorRectImageDataUrl(int r,int g,int b,double opacity,int w,int h){ Canvas canvas=CanvasUtils.createCanvas(w, h); canvas.getContext2d().setFillStyle("rgba("+r+","+g+","+b+","+opacity+")"); canvas.getContext2d().fillRect(0, 0, w, h); String image1=canvas.toDataUrl(); return image1; } public static Canvas createCircleImageCanvas(int r,int g,int b,double opacity,double radius,double lineWidth,boolean stroke){ double center=radius+lineWidth; Canvas canvas=CanvasUtils.createCanvas((int)center*2,(int)center*2); if(stroke){ canvas.getContext2d().setStrokeStyle("rgba("+r+","+g+","+b+","+opacity+")"); canvas.getContext2d().setLineWidth(lineWidth); }else{ canvas.getContext2d().setFillStyle("rgba("+r+","+g+","+b+","+opacity+")"); } canvas.getContext2d().beginPath(); canvas.getContext2d().arc(center, center, radius, 0, 360); canvas.getContext2d().closePath(); if(stroke){ canvas.getContext2d().stroke(); }else{ canvas.getContext2d().fill(); } return canvas; } public static String createCircleImageDataUrl(int r,int g,int b,double opacity,double radius,double lineWidth,boolean stroke){ double center=radius+lineWidth; Canvas canvas=CanvasUtils.createCanvas((int)center*2,(int)center*2); if(stroke){ canvas.getContext2d().setStrokeStyle("rgba("+r+","+g+","+b+","+opacity+")"); canvas.getContext2d().setLineWidth(lineWidth); }else{ canvas.getContext2d().setFillStyle("rgba("+r+","+g+","+b+","+opacity+")"); } canvas.getContext2d().beginPath(); canvas.getContext2d().arc(center, center, radius, 0, 360); canvas.getContext2d().closePath(); if(stroke){ canvas.getContext2d().stroke(); }else{ canvas.getContext2d().fill(); } String image1=canvas.toDataUrl(); return image1; } public static void drawImageByCordinate(Canvas target,CanvasElement canvas, int sx1, int sy1, int sx2, int sy2,int dx1, int dy1, int dx2, int dy2){ target.getContext2d().drawImage(canvas, sx1, sy1, sx2-sx1, sy2-sy1, dx1, dy1, dx2-dx1, dy2-dy1); } public static Anchor generateDownloadImageLink(Canvas canvas,boolean isPng,String fileName,String anchorLabel,boolean onClickToRemove){ String mime="image/png"; if(!isPng){ mime="image/jpeg"; } return HTML5Download.get().generateBase64DownloadLink(canvas.toDataUrl(mime), mime, fileName, anchorLabel, onClickToRemove); } //simple draw center public static void drawFitCenter(Canvas canvas,ImageElement img){ drawFitImage(canvas,img,ALIGN_CENTER,VALIGN_MIDDLE); } public static void drawExpandCenter(Canvas canvas,ImageElement img){ drawExpandImage(canvas,img,ALIGN_CENTER,VALIGN_MIDDLE); } /** * TODO use transform * @param canvas * @param img * @param align * @param valign */ public static void drawFitImage(Canvas canvas,ImageElement img,int align,int valign){ int cw=canvas.getCoordinateSpaceWidth(); int ch=canvas.getCoordinateSpaceHeight(); double[] newImageSize=calcurateFitSize(canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight(),img.getWidth(),img.getHeight()); double dx=0; //ALIGN_LEFT double dy=0; if(align==ALIGN_CENTER){ dx=(cw-newImageSize[0])/2; }else if(align==ALIGN_RIGHT){ dx=cw-newImageSize[0]; } if(valign==VALIGN_MIDDLE){ dy=(ch-newImageSize[1])/2; }else if(valign==VALIGN_BOTTOM){ dy=ch-newImageSize[1]; } //log("draw:"+dx+","+dy); canvas.getContext2d().drawImage(img, dx, dy, newImageSize[0], newImageSize[1]); } public static void drawFitImage(Canvas canvas,ImageElement img,IntRect rect,int align,int valign){ int cw=rect.getWidth(); int ch=rect.getHeight(); double[] newImageSize=calculateFitSize(rect.getWidth(),rect.getHeight(),img.getWidth(),img.getHeight()); double dx=rect.getX(); //ALIGN_LEFT double dy=rect.getY(); if(align==ALIGN_CENTER){ dx=dx+(cw-newImageSize[0])/2; }else if(align==ALIGN_RIGHT){ dx=dx+cw-newImageSize[0]; } if(valign==VALIGN_MIDDLE){ dy=dy+(ch-newImageSize[1])/2; }else if(valign==VALIGN_BOTTOM){ dy=dy+ch-newImageSize[1]; } //log("draw:"+dx+","+dy); canvas.getContext2d().drawImage(img, dx, dy, newImageSize[0], newImageSize[1]); } public static void drawExpandImage(Canvas canvas,ImageElement img,int align,int valign){ int cw=canvas.getCoordinateSpaceWidth(); int ch=canvas.getCoordinateSpaceHeight(); double[] newImageSize=calcurateExpandSize(canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight(),img.getWidth(),img.getHeight()); double dx=0; //ALIGN_LEFT double dy=0; if(align==ALIGN_CENTER){ dx=(cw-newImageSize[0])/2; }else if(align==ALIGN_RIGHT){ dx=cw-newImageSize[0]; } if(valign==VALIGN_MIDDLE){ dy=(ch-newImageSize[1])/2; }else if(valign==VALIGN_BOTTOM){ dy=ch-newImageSize[1]; } //log("draw:"+dx+","+dy); canvas.getContext2d().drawImage(img, dx, dy, newImageSize[0], newImageSize[1]); } /** * @deprecated typo */ public static double[] calcurateFitSize(int canvasWidth,int canvasHeight,int imageWidth,int imageHeight){ return calculateFitSize(canvasWidth,canvasHeight,imageWidth,imageHeight); } public static double[] calculateFitSize(int canvasWidth,int canvasHeight,int imageWidth,int imageHeight){ double rw=(double)canvasWidth/imageWidth; double rh=(double)canvasHeight/imageHeight; double[] result=new double[2]; if(rw<rh){ result[0]=canvasWidth; result[1]=rw*imageHeight; }else{ result[0]=rh*imageWidth; result[1]=canvasHeight; } return result; } /** * @deprecated typo */ public static double[] calcurateExpandSize(int canvasWidth,int canvasHeight,int imageWidth,int imageHeight){ return calculateExpandSize(canvasWidth,canvasHeight,imageWidth,imageHeight); } public static double[] calculateExpandSize(int canvasWidth,int canvasHeight,int imageWidth,int imageHeight){ double rw=(double)canvasWidth/imageWidth; double rh=(double)canvasHeight/imageHeight; double[] result=new double[2]; if(rw<rh){ result[0]=rh*imageWidth; result[1]=canvasHeight; }else{ result[0]=canvasWidth; result[1]=rw*imageHeight; } return result; } //TODO merge or change halign public static int ALIGN_CENTER=0; public static int ALIGN_LEFT=1; public static int ALIGN_RIGHT=2; public static int VALIGN_MIDDLE=0; public static int VALIGN_TOP=1; public static int VALIGN_BOTTOM=2; public static void drawCenter(Canvas canvas,CanvasElement img){ int cw=canvas.getCoordinateSpaceWidth(); int ch=canvas.getCoordinateSpaceHeight(); int dx=(cw-img.getWidth())/2; int dy=(ch-img.getHeight())/2; //log("draw:"+dx+","+dy); canvas.getContext2d().drawImage(img, dx, dy, img.getWidth(), img.getHeight()); } //simple draw center,no resize public static void drawCenter(Canvas canvas,ImageElement img){ int cw=canvas.getCoordinateSpaceWidth(); int ch=canvas.getCoordinateSpaceHeight(); int dx=(cw-img.getWidth())/2; int dy=(ch-img.getHeight())/2; //log("draw:"+dx+","+dy); canvas.getContext2d().drawImage(img, dx, dy, img.getWidth(), img.getHeight()); } /** * @deprecated * @param canvas * @param copy * @return */ public static ImageData getImageData(Canvas canvas,boolean copy) { if(copy){ return canvas.getContext2d().getImageData(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); }else{ return canvas.getContext2d().createImageData(canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); } } public static ImageData getImageData(Canvas canvas) { return canvas.getContext2d().getImageData(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); } public static ImageData createSameSizeImageData(Canvas canvas) { return canvas.getContext2d().createImageData(canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); } public static Canvas copyTo(ImageData imageData,@Nullable Canvas canvas) { if(canvas==null){ canvas=Canvas.createIfSupported(); } canvas.setCoordinateSpaceWidth(imageData.getWidth()); canvas.setCoordinateSpaceHeight(imageData.getHeight()); canvas.getContext2d().putImageData(imageData, 0, 0); return canvas; } /** * draw to not change dest canvas size,but need dest-canvas exist * @param imageCanvas * @param canvas * @return */ public static Canvas drawToWithDestSameSize(Canvas imageCanvas,Canvas canvas){ checkNotNull(canvas,"drawTo need canvas exist"); canvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), 0, 0,imageCanvas.getCoordinateSpaceWidth(),imageCanvas.getCoordinateSpaceHeight(), 0,0,canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); return canvas; } public static Canvas drawToFlipHorizontal(Canvas imageCanvas,Canvas canvas){ checkNotNull(canvas,"drawTo need canvas exist"); canvas.getContext2d().save(); canvas.getContext2d().translate(canvas.getCoordinateSpaceWidth(), 0); canvas.getContext2d().scale(-1, 1); canvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), 0, 0,imageCanvas.getCoordinateSpaceWidth(),imageCanvas.getCoordinateSpaceHeight(), 0,0,canvas.getCoordinateSpaceWidth(),canvas.getCoordinateSpaceHeight()); canvas.getContext2d().restore(); return canvas; } /** * copy to force change dest canvas size,but no need to canvas exist * @param imageCanvas * @param canvas * @return */ public static Canvas copyTo(Canvas imageCanvas,Canvas canvas){ return copyTo(imageCanvas,canvas,true); } public static Canvas copyToSizeOnly(Canvas imageCanvas,Canvas canvas){ return copyTo(imageCanvas,canvas,false); } public static Canvas flip(Canvas imageCanvas,boolean horizontal,boolean vertical,@Nullable Canvas workingCanvas){ if(workingCanvas==null){ workingCanvas=Canvas.createIfSupported(); } int w=imageCanvas.getCoordinateSpaceWidth(); int h=imageCanvas.getCoordinateSpaceHeight(); //set size setSize(workingCanvas, w,h); int x=horizontal?w:0; int y=vertical?h:0; int scaleX=horizontal?-1:1; int scaleY=horizontal?-1:1; workingCanvas.getContext2d().save(); workingCanvas.getContext2d().translate(x, y); workingCanvas.getContext2d().scale(scaleX, scaleY); workingCanvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), 0, 0); workingCanvas.getContext2d().restore(); return workingCanvas; } public static Canvas copyToFlipHorizontal(@Nullable Canvas imageCanvas,Canvas canvas){ if(canvas==null){ canvas=Canvas.createIfSupported(); } canvas.setWidth(imageCanvas.getCoordinateSpaceWidth()+"px"); canvas.setHeight(imageCanvas.getCoordinateSpaceHeight()+"px"); canvas.setCoordinateSpaceWidth(imageCanvas.getCoordinateSpaceWidth()); canvas.setCoordinateSpaceHeight(imageCanvas.getCoordinateSpaceHeight()); canvas.getContext2d().save(); canvas.getContext2d().translate(imageCanvas.getCoordinateSpaceWidth(), 0); canvas.getContext2d().scale(-1, 1); canvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), 0, 0); canvas.getContext2d().restore(); return canvas; } public static Canvas copyTo(Canvas imageCanvas,Canvas canvas,boolean drawImage){ if(canvas==null){ canvas=Canvas.createIfSupported(); } canvas.setWidth(imageCanvas.getCoordinateSpaceWidth()+"px"); canvas.setHeight(imageCanvas.getCoordinateSpaceHeight()+"px"); canvas.setCoordinateSpaceWidth(imageCanvas.getCoordinateSpaceWidth()); canvas.setCoordinateSpaceHeight(imageCanvas.getCoordinateSpaceHeight()); if(drawImage){ canvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), 0, 0); } return canvas; } public static void drawImage(Canvas sharedCanvas,ImageElement element) { sharedCanvas.getContext2d().drawImage(element, 0,0); } public static void drawImage(Canvas sharedCanvas,ImageElement element,int x,int y) { sharedCanvas.getContext2d().drawImage(element, x,y); } public static void drawImage(Canvas sharedCanvas,ImageElement element,int x,int y,int w,int h) { sharedCanvas.getContext2d().drawImage(element, x,y,w,h); } public static void copyAlpha(ImageData paintedData, Uint8Array grayByte) { for(int y=0;y<paintedData.getHeight();y++){ for(int x=0;x<paintedData.getWidth();x++){ paintedData.setAlphaAt(grayByte.get(y*paintedData.getWidth()+x), x, y); } } } public static void copyFromCanvasRedToImageDataAlpha(Canvas canvas,ImageData paintedData) { ImageData canvasData=ImageDataUtils.copyFrom(canvas); checkArgument(canvasData.getWidth()==paintedData.getWidth() && canvasData.getHeight()==paintedData.getHeight(),"copyToImageDataRedAsAlpha:must same size"); for(int y=0;y<paintedData.getHeight();y++){ for(int x=0;x<paintedData.getWidth();x++){ paintedData.setAlphaAt(canvasData.getRedAt(x, y), x, y); } } } public static void drawImage(Canvas sharedCanvas, Canvas imageCanvas) { sharedCanvas.getContext2d().drawImage(imageCanvas.getCanvasElement(), 0,0); } public static void drawLine(Canvas canvas, double x1, double y1, double x2, double y2) { Context2d c2d=canvas.getContext2d(); c2d.beginPath(); c2d.moveTo(x1, y1); c2d.lineTo(x2,y2); c2d.closePath(); c2d.stroke(); } public static void fillPoint(Canvas canvas, double x1, double y1) { Context2d c2d=canvas.getContext2d(); double v=c2d.getLineWidth(); c2d.fillRect(x1, y1, v, v); } public static void setSize(Canvas canvas, int w, int h) { if(canvas!=null){ canvas.setCoordinateSpaceWidth(w); canvas.setCoordinateSpaceHeight(h); canvas.setWidth(w+"px"); canvas.setHeight(h+"px"); } } /* * */ public static void clearBackgroundImage(Canvas canvas){ //better to keep w & h String w=canvas.getElement().getStyle().getWidth(); String h=canvas.getElement().getStyle().getHeight(); //canvas.getElement().removeAttribute("style");//for remove background-image not so good? canvas.getElement().setAttribute("style", "width:"+w+";height:"+h+";"); } public static void setBackgroundImage(Canvas canvas,String imageUrl){ //LogUtils.log(canvas.getElement().getStyle()); //need width & height .at least String w=canvas.getElement().getStyle().getWidth(); String h=canvas.getElement().getStyle().getHeight(); canvas.getElement().setAttribute("style", "width:"+w+";height:"+h+";background-image:"+"url(\""+imageUrl+"\");"); } public static void setBackgroundImage(Canvas canvas,String imageUrl,int iw,int ih){ //LogUtils.log(canvas.getElement().getStyle()); //need width & height .at least String w=canvas.getElement().getStyle().getWidth(); String h=canvas.getElement().getStyle().getHeight(); canvas.getElement().setAttribute("style", "width:"+w+";height:"+h+";background-image:"+"url(\""+imageUrl+"\");background-size:"+iw+"px "+ih+"px;"); } public static Canvas convertToGrayScale(Canvas canvas,@Nullable Canvas target) { ImageData data=canvas.getContext2d().getImageData(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); for(int y=0;y<data.getHeight();y++){ for(int x=0;x<data.getWidth();x++){ int value=(int) (0.299*data.getRedAt(x, y) + 0.587*data.getGreenAt(x, y) + 0.114*data.getBlueAt(x, y)); data.setRedAt(value, x, y); data.setGreenAt(value, x, y); data.setBlueAt(value, x, y); } } if(target==null){ target=Canvas.createIfSupported(); ImageDataUtils.setAlphaAll(data, 255);//set alpha } CanvasUtils.copyTo(data, target); return target; } public static Canvas createCanvas(String dataUrl,Canvas canvas) { return ImageElementUtils.copytoCanvas(dataUrl, canvas); } public static Canvas createCanvas(ImageElement element) { return ImageElementUtils.copytoCanvas(element, null); } /** * @deprecated use Point * @param canvas * @param points * @param stroke * @param style */ public static void drawPoint(Canvas canvas, List<PointXY> points,boolean stroke,@Nullable String style) { if(style!=null){ canvas.getContext2d().setStrokeStyle(style); } canvas.getContext2d().beginPath(); PointXY pt=points.get(points.size()-1); canvas.getContext2d().moveTo(pt.x, pt.y); for(int i=0;i<points.size();i++){ pt=points.get(i); canvas.getContext2d().lineTo(pt.x, pt.y); } canvas.getContext2d().closePath(); if(stroke){ canvas.getContext2d().stroke(); }else{ canvas.getContext2d().fill(); } } public static void draw(Canvas canvas, Point[] points,boolean stroke,@Nullable String style) { if(style!=null){ canvas.getContext2d().setStrokeStyle(style); } canvas.getContext2d().beginPath(); Point pt=points[points.length-1]; canvas.getContext2d().moveTo(pt.x, pt.y); for(int i=0;i<points.length;i++){ pt=points[i]; canvas.getContext2d().lineTo(pt.x, pt.y); } canvas.getContext2d().closePath(); if(stroke){ canvas.getContext2d().stroke(); }else{ canvas.getContext2d().fill(); } } public static void draw(Canvas canvas, List<Point> points,boolean stroke,@Nullable String style) { if(style!=null){ canvas.getContext2d().setStrokeStyle(style); } canvas.getContext2d().beginPath(); Point pt=points.get(points.size()-1); canvas.getContext2d().moveTo(pt.x, pt.y); for(int i=0;i<points.size();i++){ pt=points.get(i); canvas.getContext2d().lineTo(pt.x, pt.y); } canvas.getContext2d().closePath(); if(stroke){ canvas.getContext2d().stroke(); }else{ canvas.getContext2d().fill(); } } public static void draw(Canvas canvas, PointXY[] points,boolean stroke,@Nullable String style) { if(style!=null){ canvas.getContext2d().setStrokeStyle(style); } canvas.getContext2d().beginPath(); PointXY pt=points[points.length-1]; canvas.getContext2d().moveTo(pt.x, pt.y); for(int i=0;i<points.length;i++){ pt=points[i]; canvas.getContext2d().lineTo(pt.x, pt.y); } canvas.getContext2d().closePath(); if(stroke){ canvas.getContext2d().stroke(); }else{ canvas.getContext2d().fill(); } } public static Canvas copyTo(ImageElement image, @Nullable Canvas canvas) { return ImageElementUtils.copytoCanvas(image, canvas); } public static void drawDataUrl(Canvas canvas, String dataUrl) { checkNotNull(dataUrl,"drawDataUrl:dataUrl must not null"); drawImage(canvas, ImageElementUtils.create(dataUrl)); } public static void scaleViewerSize(Canvas canvas, double value) { canvas.setWidth((canvas.getCoordinateSpaceWidth()*value)+"px"); canvas.setHeight((canvas.getCoordinateSpaceHeight()*value)+"px"); } public static void resizeCanvasFrom(ImageElement imageElement, Canvas canvas) { ImageElementUtils.copytoCanvas(imageElement, canvas,false); } /** * @deprecated not image element safe * @param canvas * @param width * @param height */ public static void expandCanvas(Canvas canvas, double width, double height) { if(width%2!=0 || height%2!=0){ LogUtils.log("expandCanvas:width or height not even number.expand size is not same as arg"); } double hw=width/2; double hh=height/2; String dataUrl=canvas.toDataUrl(); setSize(canvas, (int)(canvas.getCoordinateSpaceWidth()+width), (int)(canvas.getCoordinateSpaceHeight()+height)); canvas.getContext2d().drawImage(ImageElementUtils.create(dataUrl), hw, hh); } /* public static Canvas toGrayscale(Canvas canvas,@Nullable Canvas graycanvas) { if(graycanvas==null){ graycanvas=Canvas.createIfSupported(); } //TODO create ImageData Method ImageData data=canvas.getContext2d().getImageData(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); for(int x=0;x<data.getWidth();x++){ for(int y=0;y<data.getHeight();y++){ int gray=ColorUtils.toGrayscale(data.getRedAt(x, y), data.getGreenAt(x, y), data.getBlueAt(x, y)); data.setRedAt(gray, x, y); data.setGreenAt(gray, x, y); data.setBlueAt(gray, x, y); } } CanvasUtils.createCanvas(graycanvas, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight()); graycanvas.getContext2d().putImageData(data, 0, 0); return graycanvas; } */ }