锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
This programm loads an image via java.awt.Toolkit
, scales it down to a user-defined resolution and saves it as a JPEG file. The first part, the loading of the original image, is done the same way as in Viewer. So if you don't know yet how loading images with Toolkit
works you might want to study that program first.
Different from Viewer, this program (Thumbnail) works on the command line. So you won't get any windows or other graphical user interface components. The only visual feedback is the word Done.
after the program successfully terminated.
To use this program do the following:
Thumbnail.java
(regard case). Thumbnail.java
is and compile it: javac Thumbnail.javaYou should now have a new class file
Thumbnail.class
.java Thumbnail c:\image.jpg c:\thumbnail.jpg 120 80 75The file
image.jpg
must exist already, thumbnail.jpg
will be created (and any existing file of that name overwritten).You will need Java 1.2 or higher to successfully run this program. The com.sun.image.codec.jpeg
package that will be used for saving the thumbnail is not available with all Java development kits, but as long as you are using a Sun JDK, it should be present.
With Java 1.4 a new way of writing JPEG files was introduced, the image I/O library in the package javax.imageio
. See the Screenshot.java example program. It saves as PNG, but all you have to do is change the second argument of ImageIO.write
from png
to jpg
. The advantage of ImageIO
: It is available with each 1.4+ JDK and JRE, not only those coming from Sun.
Now let's see how this program works. First, it is checked that we have exactly five arguments. If this is not the case, an error message is printed to output and the program terminates.
Next, the input image is loaded via Toolkit
and MediaTracker
just as it was done in Viewer.
The third and fourth program argument contain the maximum size of the thumbnail to be created. The actual size of the thumbnail will be computed from that maximum size and the actual size of the image (all sizes are given as pixels). The code that does this is not really very readable, and also not essential to loading and saving image files. But it is necessary to create a thumbnail that is scaled correctly.
As an example, if the two arguments for the maximum thumbnail size are both 100
and the image that was loaded is 400
times 200
pixels large, we want the thumbnail to be 100
times 50
pixels large, not 100
times 100
, because the original image is twice as wide as it is high. A 100
times 100
pixel thumbnail would contain a very skewed version of the original image.
Now that we have determined the size of the thumbnail we create a BufferedImage
of that size, named thumbImage
. We ask for a Graphics2D
object for that new thumbnail image and call its drawImage
method to draw the original image on that new image. The call to drawImage
does the actual scaling. The rendering hints for bilinear interpolation can be left out if quality is not that necessary and speed more important. For nicer results (at least in some cases) try RenderingHints.VALUE_INTERPOLATION_BICUBIC
instead of RenderingHints.VALUE_INTERPOLATION_BILINEAR
.
In order to save the scaled-down image to a JPEG file, we create a buffered FileOutputStream
with the second argument as name and initialize the necessary objects from the com.sun.image.codec.jpeg
package. The quality argument from the command line is converted from the interval 0
to 100
to the interval 0.0f
to 1.0f
, because that's what the codec expects (I mostly use 0.75f
). The higher that quality number is, the better the resulting thumbnail image quality, but also the larger the resulting file.
The call to System.exit(0);
is unfortunately necessary for some Java runtime environments (because of a bug that keeps the AWT thread from terminating).
import com.sun.image.codec.jpeg.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
/**
* Thumbnail.java (requires Java 1.2+)
* Load an image, scale it down and save it as a JPEG file.
* @author Marco Schmidt
*/
public class Thumbnail {
public static void main(String[] args) throws Exception {
if (args.length != 5) {
System.err.println("Usage: java Thumbnail INFILE " +
"OUTFILE WIDTH HEIGHT QUALITY");
System.exit(1);
}
// load image from INFILE
Image image = Toolkit.getDefaultToolkit().getImage(args[0]);
MediaTracker mediaTracker = new MediaTracker(new Container());
mediaTracker.addImage(image, 0);
mediaTracker.waitForID(0);
// determine thumbnail size from WIDTH and HEIGHT
int thumbWidth = Integer.parseInt(args[2]);
int thumbHeight = Integer.parseInt(args[3]);
double thumbRatio = (double)thumbWidth / (double)thumbHeight;
int imageWidth = image.getWidth(null);
int imageHeight = image.getHeight(null);
double imageRatio = (double)imageWidth / (double)imageHeight;
if (thumbRatio < imageRatio) {
thumbHeight = (int)(thumbWidth / imageRatio);
} else {
thumbWidth = (int)(thumbHeight * imageRatio);
}
// draw original image to thumbnail image object and
// scale it to the new size on-the-fly
BufferedImage thumbImage = new BufferedImage(thumbWidth,
thumbHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = thumbImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);
// save thumbnail image to OUTFILE
BufferedOutputStream out = new BufferedOutputStream(new
FileOutputStream(args[1]));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.
getDefaultJPEGEncodeParam(thumbImage);
int quality = Integer.parseInt(args[4]);
quality = Math.max(0, Math.min(quality, 100));
param.setQuality((float)quality / 100.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(thumbImage);
out.close();
System.out.println("Done.");
System.exit(0);
}
}
鎽樿嚜http://www-128.ibm.com/developerworks/cn/xml/x-BatikSvg/?ca=dwcn-newsletter-xml
闄堟煰
鎶鏈葷洃, 鍗椾含瀹夊厓縐戞妧
2005 騫?1 鏈?
鏈枃鏄綔鑰呭湪 SVGGIS 緋葷粺鐨勫紑鍙戝疄璺佃繃紼嬩腑鍏充簬 SVG 鍧愭爣杞崲鐨勬葷粨銆傚湪鎻忚堪 SVG 鍧愭爣鍙樻崲鍘熺悊鐨勫悓鏃訛紝浣跨敤 Apache Batik 欏圭洰瀹炵幇浜嗙浉鍏充緥瀛愩?/BLOCKQUOTE>SVG 鏄竴縐嶇敤 xml 璇█鏉ユ弿榪頒簩緇村浘褰㈠璞$殑璇█錛孲VG 鍏佽涓夌鍥懼艦瀵硅薄錛?錛庣煝閲忓浘褰紝2錛庡浘鐗囷紝3錛庢枃鏈璞°傝繖涓夌鍥懼艦瀵硅薄閮藉彲浠ユ敮鎸佸垎緇勶紝浣跨敤鏍峰紡娓叉煋錛岃繘琛屽嚑浣曞彉鎹€?/P>
SVG 榪樿兘澶熼氳繃鑴氭湰鏉ュ疄鐜頒氦浜掓搷浣滃拰鍔ㄦ佹樉紺恒傚彲浠ラ氳繃瀹氫箟鍔ㄧ敾瀵硅薄鎴栦嬌鐢╯cript 鑴氭湰鏉ュ疄鐜板姩鐢匯?/P>
1.1 涓涓?SVG 渚嬪瓙
鍥?2. 鏍鋒湰鏂囨。
鎴戜滑棣栧厛鏉ョ湅涓涓?SVG 鐨勪緥瀛愶紝紿楀彛鍙充笂瑙掓湁鍥涗釜鑹插潡錛屾瘡涓壊鍧楁槸涓涓?0脳50鐨勭煩褰€?/P>
<?xml version="1.0"?> <svg > <g> <rect x="0" y="0" width="50" height="50" style="fill:red" /> <rect x="50" y="0" width="50" height="50" style="fill:yellow" /> <rect x="0" y="50" width="50" height="50" style="fill:green" /> <rect x="50" y="50" width="50" height="50" style="fill:black" /> </g> </svg>
1.2 浣跨敤 Adobe SVG Viewer 灞曠ず鍦?SVG 鏂囨。涓疄鐜扮殑鍑犱綍鍙樻崲
緙╂斁<g transform="scale(2)">騫崇Щ<g transform="translate(200 ,200)">
鏃嬭漿<g transform="rotate(45)">
妯垏<g transform="skewX(45)">
鍥?6. 浠?y 杞翠負鍩虹嚎鍦?X 鏂瑰悜妯垏45搴?/B>
![]()
2. 鍦?Batik 涓嬪疄鐜?SVG 鐨勫嚑浣曞彉鎹?/SPAN>
2.1 Batik 鐨勫熀紜鐭ヨ瘑
2.1.1 Batik 鐨勭敤閫?/B>Batik 鏄熀浜?java 璇█瀹炵幇鐨勪竴涓?SVG 搴旂敤鐨勫伐鍏烽泦錛岀敤浜庡疄鐜板 SVG 瀵硅薄鐨勬樉紺恒佺紪杈戜互鍙婂皢 SVG 鍥懼艦瀵硅薄杞崲鎴愬叾浠栧浘鐗囨牸寮忥紝濡?jpg銆乬if 絳夈?/P>
榪欎釜欏圭洰鐨勭洰鏍囧氨鏄粰寮鍙戜漢鍛樹竴濂楃敤浜庡鐞嗘垨搴旂敤 SVG 瀵硅薄鐨勫熀紜鏍稿績妯″瀷銆備綔涓篈pache 欏圭洰鎴愬憳涔嬩竴錛岃欏圭洰涔熶負寮鍙戜漢鍛樻彁渚涗簡涓涓紑鍙戠殑鍙墿灞曠殑騫沖彴銆傚悓鏃?batik 涔熺淮鎶や簡涓涓彲浠ユ煡鐪?SVG 鏂囦歡鐨勬祻瑙堝櫒銆傝櫧鐒?batik 榪樻病鏈夊畬鍏ㄥ疄鐜?SVG 鐨勬墍鏈夋爣鍑嗚娉曞拰鏍囪錛屼絾閫氳繃姣旇緝涓嶅悓鐗堟湰鐨勫尯鍒氨浼氬彂鐜幫紝浠栨鍦ㄤ互寰堥珮鐨勬晥鐜囪鐩?SVG 鎵鏈夌殑鏍囧噯銆?/P>
2.1.2 璁╂垜浠疄鐜頒竴涓畝鍗曠殑 Batik 紼嬪簭
棣栧厛璁╂垜浠疄鐜頒竴涓畝鍗曠殑鍩轟簬 Batik 鐨?SVG 嫻忚鍣ㄣ侭atik 灝佽浜唎rg.apache.batik.swing.JSVGCanvas 瀵硅薄鍙互鐢ㄤ簬鍦?swing 涓祵鍏?SVG 鏄劇ず瀹瑰櫒錛屽茍鍙互閫氳繃 org.apache.batik.swing.JSVGCanvas 鎻愪緵鐨勬柟娉曞 SVG 鏂囨。鍜屽浘鍍忚繘琛屾搷浣溿傝繖涓祻瑙堝櫒鍙互鏀寔澶ч儴鍒?SVG 鐨勮娉曞拰鏍囧噯鍖呮嫭鑴氭湰浜や簰鐨勫姛鑳斤紝浣嗘殏鏃惰繕娌℃湁寮曞叆鍔ㄧ敾銆傚叧浜庡姩鐢誨拰鑴氭湰浜や簰鐨勫唴瀹規垜浠細鍦ㄤ互鍚庣殑鏂囩珷涓榪幫紝浠婂ぉ鍏堥泦涓В鍐沖嚑浣曞彉鎹㈢殑闂銆?/P>
鍥?7. 榪愯紼嬪簭鎵撳紑鎴戜滑緙栧啓鐨?SVG 鐨勪緥瀛?/B>
![]()
鍙互閫氳繃璇ラ〉闈㈠紩瀵艱繍琛岃紼嬪簭錛?
鍥?8. 灝嗕竴涓?SVGCanvas 娣誨姞鍒扮晫闈?/B>
浠庨檮浠朵腑鍙互鏌ョ湅璇ョ▼搴忕殑瀹屾暣浠g爜錛屼篃鍙氳繃 緗戜笂涓嬭澆鍦板潃 榪愯璇ョ▼搴忋?
private javax.swing.JPanel SVGPanel = new javax.swing.JPanel(); private JSVGCanvas svgCanvas = new org.apache.batik.swing.JSVGCanvas(); SVGPanel.add("Center", svgCanvas);
2.2 閫氳繃 Batik 鐨?GVT 妯″瀷瀹炵幇 SVG 鐨勫嚑浣曞彉鎹?/SPAN>
2.2.1 涓轟粈涔堣浣跨敤 Batik 鏉ュ疄鐜?SVG 鐨勫嚑浣曞彉鎹?/B>褰撴垜浠敤 Batik 宸ュ叿闆嗕綔涓?SVG 瀹㈡埛绔殑瑙e喅鏂規鏃訛紝濡傜緝鏀懼鉤縐昏繖鏍風殑鎿嶄綔灝卞湪鎵闅懼厤浜嗐備絾 Batik 騫舵病鏈夌洿鎺ユ敮鎸佸 Adobe SVG Viewer 閭f牱鐨勯紶鏍囨嫋鍔ㄥ嚑浣曞彉鎹㈢殑鎿嶄綔錛岃繖灝辮姹傛垜浠榪欎簺鍔熻兘榪涜緙栫▼澶勭悊銆?/P>
鍦ㄥ垎鏋?SVG 鐨勫嚑浣曞彉鎹㈢殑緇嗚妭涔嬪墠錛屽厛璁╂垜浠簡瑙d竴涓嬪熀鏈殑鎿嶄綔緙栫▼鏂瑰紡銆?/P>
2.2.2 Batik 涓嬮氳繃 java.awt.geom.AffineTransform 鏉ュ疄鐜?SVG 鐨勫嚑浣曞彉鎹?/B>
JSVGCanvas 鎻愪緵鏂規硶鍙互鑾峰彇 java.awt.geom.AffineTransform 瀵硅薄銆侫ffineTransform 鏄敤浜庡疄鐜?D 鍑犱綍鍥懼艦鍧愭爣鍙樻崲澶勭悊鐨勫璞★紝鍙互閫氳繃璇ュ璞¤繘琛屼簩緇村嚑浣曠┖闂翠腑涓や釜鍧愭爣緋葷殑鐩鎬簰鏄犲皠鍜屽彉鎹€?/P>
騫崇Щ:
//鍚戝乏鍜屽悜涓嬪鉤縐?0涓儚绱? java.awt.geom.AffineTransform rat = svgCanvas.getRenderingTransform(); rat.translate(50,50); svgCanvas.setRenderingTransform(rat);
緙╂斁:
//浠ュ睆騫曞乏涓婅鍘熺偣涓哄浐瀹氱偣榪涜緙╂斁鎿嶄綔 java.awt.geom.AffineTransform rat = svgCanvas.getRenderingTransform(); rat.scale(0.5,0.5); svgCanvas.setRenderingTransform(rat);
鏃嬭漿:
//浠ュ睆騫曞乏涓婅鍘熺偣涓哄浐瀹氱偣榪涜鏃嬭漿緙╂斁 java.awt.geom.AffineTransform rat = svgCanvas.getRenderingTransform(); rat.rotate(3.1415926/4); svgCanvas.setRenderingTransform(rat);
澶嶅悎鍙樻崲:
//涓涓患鍚堝鉤縐匯佹斁澶у拰鏃嬭漿90搴︾殑澶嶅悎鍙樻崲 java.awt.geom.AffineTransform rat = svgCanvas.getRenderingTransform(); rat.translate(50錛?0); rat.scale(2錛?); rat.rotate(3.1415926/4); svgCanvas.setRenderingTransform(rat);
3. 褰撴垜浠渶瑕佽繘琛屽鍚堝嚑浣曞彉鎹㈢殑鏃跺?/SPAN>
3.1 鍏堟潵璁╂垜浠氳繃涓嶅悓鐨勫彉鎹唬鐮佺粍鍚堝疄鐜板鍚堝嚑浣曞彉鎹?/SPAN>
//鏀懼ぇ涓鍊嶅拰騫崇Щ50涓儚绱犵殑澶嶅悎鍙樻崲
鍏堣鎴戜滑鐪嬬涓涓緥瀛?
AffineTransform rat = svgCanvas.getRenderingTransform(); rat.scale(2,2); rat.translate(50,50); svgCanvas.setRenderingTransform(rat);
鍙互鐪嬪緱鍑烘潵錛岃繖涓彉鎹㈢殑鏈緇堟晥鏋滄槸錛氬浘褰㈢殑褰㈢姸鏀懼ぇ涓鍊嶏紝鍘熷浘褰㈢殑錛?錛?錛夊師鐐瑰潗鏍囧鉤縐?00涓儚绱犮?/P>
鍐嶆潵鐪嬬浜屼釜渚嬪瓙:
//鏀懼ぇ涓鍊嶅拰騫崇Щ50涓儚绱犵殑澶嶅悎鍙樻崲 AffineTransform rat = svgCanvas.getRenderingTransform(); rat.translate(50,50); rat.scale(2,2); svgCanvas.setRenderingTransform(rat);
榪欎釜鍙樻崲鐨勬渶緇堟晥鏋滄槸錛氬浘褰㈢殑褰㈢姸鏀懼ぇ涓鍊嶏紝鍘熷浘褰㈢殑錛?錛?錛夊師鐐瑰潗鏍囧鉤縐?0涓儚绱犮?/P>
3.2 鍏抽敭鏄『搴?/SPAN>
姣旇緝涓涓嬭繖涓ょ騫崇Щ鍚庣殑鏁堟灉浼氬彂鐜?鍙槸鍥犱負緙╂斁鍜屽鉤縐葷殑欏哄簭涓嶅悓錛屽彉鎹㈠悗鐨勭粨鏋滃氨鍙戠敓浜嗗尯鍒傜涓涓緥瀛愬疄闄呭鉤縐葷殑涓嶆槸50涓儚绱?鑰屾槸100涓儚绱犮傝岀浜屼釜渚嬪瓙鍒欐槸騫崇Щ浜?0涓儚绱犮?/P>鏈夊叴瓚g殑璇昏呭彲浠ユ坊鍔犲叾浠栧嚑浣曞彉鎹㈡柟寮忥紝騫舵祴璇曚笉鍚岀殑鍙樻崲欏哄簭錛屼細鍙戠幇澶嶅悎鍙樻崲鐨勯『搴忎笌澶嶅悎鍙樻崲鐨勬渶緇堟晥鏋滄槸绱у瘑鐩稿叧鐨勩傞偅涔堝浣曞垎鏋愬拰璁$畻澶嶅悎鍙樻崲鐨勫彉鎹㈢粨鏋滃憿錛熻繖閲屾垜浠渶瑕佽ˉ鍏呬竴鐐規暟瀛︾煡璇嗕簡銆?/P>
3.3 瀵瑰崟涓鐨勫嚑浣曞彉鎹㈣繘琛屾暟瀛︽ā鍨嬪垎鏋?/SPAN>
瀵硅綆楁満鍥懼艦瀛︿腑鍥懼艦鍙樻崲鐩稿叧鐞嗚寰堢啛鎮夌殑浜哄彲浠ヨ煩榪囪繖閮ㄥ垎鐩存帴鐪?Batik 鐨勫疄鐜版柟寮忋傝繖鑺備嬌鐢ㄧ殑榻愭寮忓浘鐗囧紩鐢ㄨ嚜 SVG鏍囧噯涓叧浜庡潗鏍囧彉鎹㈢殑榻愭寮忕殑渚嬪瓙鎻掑浘銆?棣栧厛鎴戜滑鏉ヤ簡瑙d竴涓嬪浘褰㈠彉鎹㈢殑榻愭寮忚綆楁柟娉曪細
榪欐槸涓涓熀鏈浘褰㈠彉鎹㈤綈嬈″紡銆傜瓑寮忕殑鏈鍙寵竟鏄竴涓潗鏍囩偣鏈彉鎹㈠墠鐨勫潗鏍囩煩闃碉紝鏈宸﹁竟鏄鍧愭爣鐐瑰彉鎹㈠悗鎵鍦ㄤ綅緗殑涓涓笁琛屼竴鍒楃殑鍧愭爣鐭╅樀錛屼腑闂撮偅涓笁琛屼笁鍒楃殑鐭╅樀灝辨槸鍙樻崲鐭╅樀銆備笉鍚岀殑鍙樻崲鏂瑰紡灝嗗搴斾笉鍚岀殑鍙樻崲鐭╅樀錛屽浘褰㈠鉤縐繪晥鏋滃氨鏄氳繃榪欐牱涓涓彉鎹㈤綈嬈″紡鏉ュ疄鐜扮殑銆?/P>
騫崇Щ:濡傛灉闇瑕佸皢鍥懼艦騫崇Щ錛坱x錛宼y錛変釜鍧愭爣鏃訛紝閲囩敤濡備笅鐨勫彉鎹㈢煩闃靛甫鍏ュ彉鎹㈡柟紼嬨?/P>
緙╂斁錛氬鏋滈渶瑕佸湪 x 杞存柟鍚戝疄鐜?sx 鍊嶇緝鏀撅紝鍦?y 杞存柟鍚戝疄鐜?sy 杞寸緝鏀炬椂錛岄噰鐢ㄥ涓嬬殑鍙樻崲鐭╅樀甯﹀叆鍙樻崲鏂圭▼銆?/P>
鏃嬭漿:濡傛灉闇瑕佸皢鍥懼儚鏃嬭漿 a 搴︽椂錛屼嬌鐢ㄥ涓嬬殑鍙樻崲鐭╅樀甯﹀叆鍙樻崲鏂圭▼銆?/P>
3.4 閲囩敤澶嶅悎鍑犱綍鍙樻崲鐨勬暟瀛︽ā鍨嬪垎鏋?/SPAN>
3.4.1 鏁板鍒嗘瀽褰撲袱緇勫彉鎹㈠悓鏃朵綔鐢ㄤ簬鍚屼竴涓浘鍍忔椂錛岃繛緇嬌鐢ㄨ絳夊紡錛屽緱鍑哄涓嬬瓑寮忋傜敱浜庡仛鍙樻崲鐨勬椂鍊欐槸灝嗗彉鎹㈢煩闃墊斁鍦ㄧ煩闃電Н鐨勫乏杈癸紝鎵浠ュ浜庡鍚堝彉鎹㈢殑寮忓瓙錛屽簲璇ヤ粠鍙沖悜宸﹁繘琛岃銆傚浜庡涓嬬殑寮忓瓙錛氫粠鍙寵嚦宸︿緷嬈℃槸鍙樻崲鍓嶇殑鍧愭爣錛岀涓嬈¤漿鎹㈢殑杞崲鐭╅樀錛岀浜屾杞崲鐨勮漿鎹㈢煩闃碉紝杞崲鍚庣殑鍧愭爣鍊箋?/P>
榪涗竴姝ユ帹瀵?n 嬈″嚑浣曞彉鎹㈢殑澶嶅悎鍙樻崲絳夊紡錛?/P>
3.4.2 鏉ュ疄璺典竴涓?/B>
浣跨敤榪欐牱涓涓鍚堝彉鎹㈡柟寮忥細
<g transform="translate(50,90) rotate(-45) translate(130,160)">
鏍規嵁鍓嶉潰鐨勫垎鏋愮粨鏋滃甫鍏ュ彉鎹㈡柟紼嬶紝寰楀嚭濡備笅絳夊紡
鏍規嵁璁$畻鍚庣殑鍙樻崲鐭╅樀錛屽彲寰楀彉鎹㈢粨鏋滄槸鍥懼艦鏁翠綋騫崇Щ鍒幫紙255.03,111.21錛夛紝鍚屾椂鍥懼艦鑷韓娌塊『鏃墮拡鏂瑰悜鏃嬭漿45搴︺傛煡鐪嬪疄闄呭彉鎹㈢粨鏋滐紝榪欓噷鎴戜滑鍙互鍙戠幇錛屽浜?SVG 鐨勫彉鎹㈡潵璇達紝铏界劧鎴戜滑涔犳儻涓婁粠宸﹀線鍙沖啓鍙樻崲鍙傛暟鐨勶紝瀹為檯涓婂浘褰㈠仛鍙樻崲鐨勬椂鍊欐槸浠庡彸杈圭殑鍙樻崲鍙傛暟寮濮嬩緷嬈¤繘琛屽浘褰㈠彉鎹㈢殑銆?/P>
3.5 鍒嗘瀽涓涓?Batik 鏄浣曞疄鐜?SVG 鐨勫鍚堝嚑浣曞彉鎹㈢殑
3.5.1 鍏堢湅絎竴涓緥瀛愶細榪欎釜鍙樻崲鏄厛鏀懼ぇ鍚庡鉤縐葷殑鍙樻崲錛屽叾鍙樻崲鏁堟灉鏈緇堟槸錛屽厛灝嗗浘褰㈢殑褰㈢姸鏀懼ぇ涓鍊嶏紝鐒跺悗灝嗗浘褰㈡暣涓鉤縐?00涓儚绱犮傝繖閲屾垜浠彲浠ョ湅鍑猴紝铏界劧鎴戜滑鏄厛榪涜鐨勬斁澶у彉鎹紝鍚庤繘琛岀殑騫崇Щ鎿嶄綔錛屼絾褰撴垜浠繘琛屽鍚堝彉鎹㈢殑鏃跺欑敱浜庡疄闄呰繍綆楁椂涓婃槸鍏堣繘琛屼簡騫崇Щ錛屽悗榪涜浜嗙緝鏀俱傛垨鑰呯畝鍗曠殑鐞嗚В涓轟粠宸﹀悜鍙沖厛鍐欑緝鏀劇煩闃碉紝鍐嶅啓騫崇Щ鐭╅樀錛岃繖鏍峰緱鍑虹殑鍙樻崲鐭╅樀灝卞彲浠ュ鍙樻崲鍚庣殑鏁堟灉榪涜璁$畻浜嗐?/P>
//鏀懼ぇ涓鍊嶅拰騫崇Щ50涓儚绱犵殑澶嶅悎鍙樻崲 //<g transform=" scale(2 ) translate(50 50)"> AffineTransform rat = svgCanvas.getRenderingTransform(); rat.scale(2,2); rat.translate(50,50); svgCanvas.setRenderingTransform(rat);
鎴戜滑鍙互灝嗚繖涓彉鎹㈠搴旂殑璁$畻鐭╅樀鍐欏嚭鏉ワ細
鏍規嵁涓婇潰鐨勫垎鏋愭垜浠彲浠ョ湅鐨勫嚭錛屽厛榪涜緙╂斁鍙樻崲鍦ㄨ繘琛屽鉤縐誨彉鎹㈢殑澶嶅悎鍙樻崲鏃訛紝鍙樻崲鍚庡師鍥懼厓鐨勫潗鏍囦細鏄犲皠鍒版柊鐨勪綅緗紝鍏朵腑錛?/P>
X1=Sx(X+dx)
Y1=Sy(Y+dy)3.5.2 鍐嶆潵鐪嬬浜屼釜渚嬪瓙錛?/B>
榪欎釜鍙樻崲鏄厛鏀懼ぇ鍚庡鉤縐葷殑鍙樻崲錛屽叾鍙樻崲鏁堟灉鏈緇堟槸錛屽厛灝嗗浘褰㈡暣涓鉤縐?0涓儚绱狅紝鐒跺悗灝嗗浘褰㈢殑褰㈢姸鏀懼ぇ涓鍊嶃?/P>
//鏀懼ぇ涓鍊嶅拰騫崇Щ50涓儚绱犵殑澶嶅悎鍙樻崲 //<g transform="translate(50錛?0) scale(2 )"> AffineTransform rat = svgCanvas.getRenderingTransform(); rat.translate(50,50); rat.scale(2,2); svgCanvas.setRenderingTransform(rat);
鎴戜滑鍙互灝嗚繖涓彉鎹㈠搴旂殑 svg 鏂囨。瀹炵幇鍐欏嚭鏉ワ細
<g transform="translate(50 50) scale(2 )">
鏍規嵁涓婇潰鐨勫垎鏋愭垜浠彲浠ョ湅鐨勫嚭錛屽厛榪涜騫崇Щ鍙樻崲鍐嶈繘琛岀緝鏀懼彉鎹㈢殑澶嶅悎鍙樻崲鏃訛紝鍙樻崲鍚庡師鍥懼厓鐨勫潗鏍囦細鏄犲皠鍒版柊鐨勪綅緗紝鍏朵腑錛?/P>
X1=Sx*X+dx
Y1=Sy*Y+dy3.5.3 瀹炵敤榪欎袱涓緥瀛愮殑鎴愭灉
鍋囪鎴戜滑闇瑕佸皢鍥懼艦鍘熺偣鐨勪綅緗Щ鍔ㄥ埌錛?50錛?00錛夛紝鍚屾椂褰㈢姸鏀懼ぇ鍒板師鏉ョ殑3鍊嶏紝璇ュ浣曡繘琛屽彉鎹㈡潵瀹炵幇榪欐牱鐨勬晥鏋滃憿錛?/P>
浣跨敤絎竴涓緥瀛愮殑鍒嗘瀽緇撴灉錛屽厛榪涜緙╂斁鍙樻崲錛屽啀榪涜騫崇Щ鍙樻崲鐨勬柟紼嬪彉鎹細
鏍規嵁鎺ㄥ鍙煡闇鍏堣繘琛?鍊嶇殑緙╂斁鍙樻崲錛屽啀騫崇Щ錛?0錛?00錛変釜鍧愭爣灝卞彲浠ュ疄鐜版寚瀹氱殑鍙樻崲鏁堟灉銆傚疄鐜扮▼搴忓涓?/P>
//<g transform=" scale(3 ) translate(50錛?00)"> AffineTransform rat = svgCanvas.getRenderingTransform(); rat.scale(3,3); rat.translate(50,100); svgCanvas.setRenderingTransform(rat);
鑻ュ厛榪涜騫崇Щ鍙樻崲錛屽啀榪涜緙╂斁鍙樻崲鐨勮瘽錛屾牴鎹浜屼釜渚嬪瓙鐨勬帹瀵肩粨鏋滐細
鍙煡搴斿厛榪涜錛?50錛?00錛夌殑騫崇Щ鎿嶄綔錛屽啀瀹炵幇3鍊嶇殑緙╂斁鎿嶄綔銆傚疄鐜扮▼搴忓涓嬶細
//<g transform=" translate(150錛?00) scale(3 )"> AffineTransform rat = svgCanvas.getRenderingTransform(); rat.translate(150,300); rat.scale(3,3); svgCanvas.setRenderingTransform(rat);
4. 涓涓父鐢ㄥ鍚堝彉鎹㈠疄渚嬬殑瀹炵幇--瀹氱偣鍙樻崲
涓婅竟鎴戜滑鍒嗘瀽浜?Batik 瀹炵幇 SVG 鍥懼艦鍙樻崲鐨勫師鐞嗗拰璁$畻鏂規硶銆備笅闈㈡垜浠敤鍒嗘瀽鐨勭粨鏋滃疄鐜頒竴涓父鐢ㄧ殑鍙樻崲瀹炰緥錛氬畾鐐瑰彉鎹€傚彉鎹㈢殑縐嶇被鍖呮嫭緙╂斁錛屾棆杞紙涓鑸笉鑰冭檻瀹氱偣騫崇Щ榪欎釜姒傚康錛夈?/P>鎵璋撳畾鐐瑰彉鎹㈠氨鏄湪鍥懼艦鍙樻崲涓寚瀹氫竴涓浐瀹氱殑鐐癸紝鍦ㄥ彉鎹㈢粨鏉熷悗錛岃鐐圭殑浣嶇疆涓嶅彂鐢熷彉鍖栥傚畾鐐瑰彉鎹㈠湪 GIS 鐨勫疄闄呰繍鐢ㄤ腑寰堝父瑙侊紝姣斿灝嗗湴鍥炬斁澶у埌鎸囧畾鍊嶆暟鑰屼繚鎸佸湴鍥劇殑鏌愪釜浣嶇疆錛堝錛氶紶鏍囩偣鍑葷殑浣嶇疆錛変笉鍙戠敓鍙樺寲銆傛垜浠互瀹氱偣緙╂斁涓轟緥鎻忚堪瀹氱偣鍙樻崲鐨勪嬌鐢ㄦ柟娉曘?/P>
鍋囪鎴戜滑鐢?x1,y1)鐐規潵鍋氬畾鐐瑰彉鎹㈢殑鍩哄噯鐐硅繘琛屽嚑浣曞彉鎹紝瑕佹眰瀹炵幇鍙樻崲鍚庯紙x1,y1錛夌殑浣嶇疆涓嶅彉銆?/P>
瀹氱偣鍙樻崲鐨勫熀鏈濇兂鏄熀浜庤繖鏍蜂竴涓壒鎬э細褰撳浘鍍忚繘琛岀緝鏀撅紝鎴栨棆杞彉鎹㈢殑鏃跺欙紝鍧愭爣鍘熺偣鐨勪綅緗茍涓嶅彂鐢熷彉鍖栥傚畾鐐瑰彉鎹㈢殑瀹炵幇鏂規硶灝辨槸錛屽厛灝嗗熀鍑嗙偣錛坸1,y1錛夊鉤縐誨埌鍘熺偣鍗沖仛涓嬈-x1,-y1]鍙樻崲錛岃繘琛屽彉鎹㈠悗鍐嶅皢鍙樻崲鍚庣殑鍘熺偣騫崇Щ鍒幫紙x1,y1錛夊嵆鍐嶈繘琛屼竴嬈x1,y1]鍙樻崲銆?/P>
瀹為檯緙栫▼鐨勬椂鍊欙紝鎴戜滑鏃犻渶瀵瑰畾鐐瑰彉鎹㈠仛濡傛澶嶆潅鐨勮繍綆椼備緥濡傚彲浠ラ噰鐢ㄥ涓嬬殑鏂瑰紡瀹炵幇閽堝錛?0,50錛夌殑瀹氱偣鍙樻崲錛?/P>
//浠ワ紙50錛?0錛夌偣涓哄熀鍑嗙偣榪涜鍑犱綍鍙樻崲 //<g transform="translate(50錛?0) 鈥︹︹︹︹?translate(-50錛?50)"> AffineTransform rat = svgCanvas.getRenderingTransform(); rat.translate(50錛?0); //鍏朵粬鍙樻崲鏂瑰紡 鈥︹︹︹︹︹? 鈥︹︹︹︹︹? 鈥︹︹︹︹︹? rat.translate(-50,-50); svgCanvas.setRenderingTransform(rat);
- 鏈夊叧 SVG 鐨勮儗鏅煡璇嗭紝璇烽槄璇?developerWorks 涓婄殑鏁欑▼錛? 鍙幾緙╁悜閲忓浘褰粙緇?/A>"
- Scalable Vector Graphics (SVG) 1.0 Specification
- Batik欏圭洰浠嬬粛 http://xml.apache.org/batik/
Pudgy's World 2005-08-20 08:55 鍙戣〃璇勮]]>