рдкреАрдбреАрдПрдл рдлреНрд▓реИрд╢ рд╕реЗ рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛

рдЫрд╡рд┐
рдПрдХ рдмрд╛рд░, рдЬрдм рдШрд╛рд╕ рд╣рд░рд┐рдпрд╛рд▓реА рдереА, рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рдФрд░ рдЕрддреНрдпрд╛рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореБрдЭреЗ рдПрдХ рдЕрджреНрднреБрдд рдЧреБрдЪреНрдЫрд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдирд╛ рдкрдбрд╝рд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рд╕реНрддреБрдХрд╛рд░ рдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдордЭрд╛


рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП: рдкреНрд░рддреНрдпреЗрдХ рд╣рдЬрд╛рд░ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреАрдбреАрдПрдл рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рдПрдХ рдкрд╛рдЧрд▓ рд╕реВрдЪреА рд╣реИред рд░рдВрдЧреАрди рдПрдирд┐рдореЗрдЯреЗрдб рдкреНрд░рд╕реНрддреБрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╡реЗрдм рдкрд░ рдЬрд╛рд░реА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдЙрдиреНрд╣реЛрдВрдиреЗ рдлрд╝реНрд▓реИрд╢ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрд╛, рдЬреЛ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдЦрд┐рд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд░рдВрдЧреАрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВред

рд╕рдорд╕реНрдпрд╛: рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд▓рдЧрд╛рддрд╛рд░ рдмрджрд▓ рд░рд╣реА рд╣реИрдВ, рдФрд░ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рддрд╛ рдмрд╣реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдПрдХ рдШрдВрдЯреЗ (!) рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпреЛрдВ рдФрд░ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░реЗрдВ?



рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


рдЫрд╡рд┐
рд╕рд╡рд╛рд▓ рд╡рд╛рдЬрд┐рдм рд╣реИ - рдпрд╣ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдХреНрдпреЛрдВ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдмрд╣реБрдд рдЬрд░реВрд░реА рд╣реИрдВ, рдФрд░ 200 рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрд╕реНрдЯрд░ рдкреИрджрд╛ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдпрд╣ рд╕рдм рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣рдорд╛рд░рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдлрд┐рд░ - рдФрд░ рдЬрд╝реВрдо рдХреЗ рд╕рд╛рде рдлрд┐рд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?

рдЗрд╕рд▓рд┐рдП, рдбреЗрд╕реНрдХрдЯреЙрдк рдХреЗ рд▓рд┐рдП - рдкреНрд░рд╛рдЪреАрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдлреНрд▓реИрд╢ (рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЖрдИрдИ рдХреЗ рд▓рд┐рдП рдЪреАрдпрд░реНрд╕), рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреЗ рд▓рд┐рдП рдПрдЪрдЯреАрдПрдордПрд▓ 5ред рд╡реЗрдХреНрдЯрд░ рдЪрд┐рддреНрд░ (рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЧреНрдпрд╛рд░рд╣ рдПрд╕рд╡реАрдЬреА-рд╢реЗрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЧреЛрд▓рд┐рдпрд╛рдВ рдЕрднреА рднреА рдХрдордЬреЛрд░ рд░реВрдк рд╕реЗ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рд╣реИрдВ)ред

рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджрдмрд╛рдЬреА рдореЗрдВ (рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣) рдЦреБрд▓рд╛ред

рдореИрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХреНрдпрд╛


рдореИрдВ рдЗрд╕реЗ 500 рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкреАрдбреАрдПрдл рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рдкрд░рд┐рдЪрд╛рд▓рди рд╕рдордп 1 рдШрдВрдЯрд╛ 2 рдорд┐рдирдЯ ред

рдпрд╣рд╛рдБ рдЖрдк рд╣реИрдВ, рджрд╛рджреА, рдФрд░ рд╕реЗрдВрдЯ рдЬреЙрд░реНрдЬ рдбреЗ!

рдХрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ?


рдЫрд╡рд┐
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЪрд╛рд░ рдмрд╛рд░ рдкреАрдбреАрдПрдл рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдХрдо рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ ImageMagick рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХрдиреНрд╡рд░реНрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдордп рдХреЗ 3/4 рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рдЙрд╕ рдХреНрд╖рдг рдерд╛ рдЬрдм рдПрдХ рднрд╛рдк рд╕реЗ рдврдХреЗ рд▓реЛрд╣реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдиреЗ рдореЗрд░реЗ рдХрдорд░реЗ рдореЗрдВ рджреЗрдЦрд╛ рдФрд░ рдХрд╣рд╛: рддрддреНрдХрд╛рд▓ рдЖрдкрдХреЗ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ! рдореИрдВ рдЦреЗрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реВрдВред

рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рджрд┐рд╢рд╛ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд╕рдЪ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ - рдЬрд╣рд╛рдВ рдЬрд╛рдирд╛ рд╣реИ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, "рдХрд▓", рд▓реЗрдХрд┐рди рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдХрдмрд╛рдбрд╝ рдХреЛ рдЕрд╕рдлрд▓ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдорд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЕрдкрдирд╛ рдзреНрдпрд╛рди рдЬрд╛рд╡рд╛ рдХреА рдУрд░ рдореЛрдбрд╝рддреЗ рд╣реИрдВред

рдирдП рдкрд╛рддреНрд░


рдЫрд╡рд┐
рд╕рдЬреНрдЬрдиреЛрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рд▓реЗрдВ:



рдФрд░ рд╕рдВрдпреЛрдЬрди рд╢реБрд░реВ рдХрд░реЗрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рд░реНрдХрд╕ рдФрд░ рдмреЛрд░рд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ, рдФрд░ рд╢реБрд░реВ рдХрд░реЗрдВ:

public class PdfConv { public int startConversion(String pdfFile) { ... } public int getPages() { ... } public int nextPage(int pageNo, String outputFileName) { ... } public int endConversion() { ... } } 

рдФрд░ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред

 public static void main(String[] argv) throws Exception { for(int jjk =0; jjk <argv.length; ++jjk) { PdfConv conv = new PdfConv(); conv.startConversion(argv[jjk]); int k = conv.getPages(); for (int j = 0; j < k; ++j) { conv.nextPage(j, argv[jjk] + "_" + j + ".svg"); conv.nextPage(j, argv[jjk] + "_" + j + ".png"); conv.nextPage(j, argv[jjk] + "_" + j + ".swf"); ... } } } 

рдЫреЛрдЯреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рд▓рд┐рдЦрдирд╛ рд╣реИред

рдкрд╣рд▓реА рд░реЗрдХ


рдЫрд╡рд┐
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЬреЛ рд▓рд┐рдмрд╛рд╕ рдЪреБрдирд╛ рд╣реИ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдХреБрдЫ рдЧрдВрднреАрд░ рджреЛрд╖ рд╣реИрдВ:

  1. рд▓рд╛рдкрддрд╛ SMask рд╕рдорд░реНрдерди
  2. рдХреЛрдИ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рднреА рдирд╣реАрдВ рд╣реИрдВ
  3. JPEG2000 рдкреБрд░рд╛рдиреА рдЧрд▓рддрдлрд╣рдореА
  4. рдХрд┐рд╕реА рднреА рддреАрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдлреЛрдВрдЯ рдХреЗ рд╕рд╛рде рдЕрдЬреАрдм, рдЖрджрд┐ред рдЗрд╕рдХреА рдорд╣рд┐рдорд╛ рдореЗрдВ

Googling рдлреЛрдВрдЯ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧрдкрде рдореЗрдВ JAI рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

рдЖрдкрдХреЛ рдкреАрдбреАрдПрдл рдлрд╛рдЗрд▓ рдХреЛ PDFRenderer рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рддреБрдЪреНрдЫ рд╣реИ - рд╣рдо рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╕рдВрджрд░реНрдн рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб, рдФрд░ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рддрд╕реНрд╡реАрд░ рдореЗрдВ рдЖрдХреГрддрд┐ рдХреЗ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рдбреНрд░рд╛рдЗрдВрдЧ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рдЯреНрд░рд╛рдЗрдЯ, рд▓реЗрдХрд┐рди рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓ред

рд╣рдо рдХреЗрд╡рд▓ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗ рдЙрди рдЬрдЧрд╣реЛрдВ рдкрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд▓рд╛рдЗрдб рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдлрд╕рд▓ рдФрд░ рдЕрдиреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛, рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИред

рдкрд╣рд▓реЗ рдЪрд░рдг рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖ рд░рд╣рд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ):

 private PDFFile pdf = null; private FileChannel fic = null; public int startConversion(String pdfFile) throws Exception { File fix = new File(pdfFile); FileInputStream fin = new FileInputStream(fix); fic = fin.getChannel(); MappedByteBuffer mbb = fic.map(FileChannel.MapMode.READ_ONLY, 0, fix.length()); pdf = new PDFFile(mbb); return pdf.getNumPages(); } public int getPages() throws Exception { return pdf.getNumPages(); } public int endConversion() throws Exception { if (fic != null) fic.close(); pdf = null; fic = null; return 1; } public int nextPage(int pageNo, String outputMask) { PDFPage page = pdf.getPage(pageNo + 1); if (page == null) return -1; Rectangle bounds = page.getBBox().getBounds(); DrawingCtx ctx = DrawingCtxBuilder.build( outputMask, new Dimension(bounds.x + bounds.width, bounds.y + bounds.height)); PDFRenderer rx = new PDFRenderer(page, ctx.getContext(), bounds, null, null); rx.go(); rx.waitForFinish(); ctx.saveTo(outputMask); return 1; } 

рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд╣реА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд▓реЛ рдЕрдореВрд░реНрддрддрд╛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдЪрд▓реЛ рд░реЛрдЬрд╝рд╡реЗрд▓реНрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛


рдЫрд╡рд┐
рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдРрд╕рд╛ рд╣реИ рдХрд┐ рдмреЛрд░рд┐рд╕ рднреА рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

 abstract class DrawingCtx { protected Graphics2D g2; protected Dimension size; DrawingCtx(Dimension size) { this.size = size; } public Graphics2D getGraphics() { return g2; } public abstract void saveTo(String fileName) throws Exception; } class DrawingCtxBuilder { public static build(String fileName, Dimension size) throws Exception { String type = fileName.substring(fileName.lastIndexOf('.') + 1).toUpperCase(); if(type.equals("SVG")) return new SvgDrawingCtx(size); else if(type.equals("PNG")) return new ImageDrawingCtx(size); else if(type.equals("SWF")) return new SwfDrawingCtx(size); ... throw new Exception(type + ": unknown converter requested"); } } 

рд╣рдорд╛рд░реЗ рдХрдВрдХрд╛рд▓ рдХреЛ рдорд╛рдВрд╕ рд╕реЗ рднрд░реЗрдВ - рдФрд░ рдХрдбрд╝рд╛рд╣реА рдХрд╛рдо рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдПрд╕рд╡реАрдЬреА рдФрд░ рдмрд╛рдЯрд┐рдХ


рдЫрд╡рд┐
рдпрд╣рд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдкрд╛рдЪреЗ рдмрд╛рдЯрд┐рдХ рдПрд╕рд╡реАрдЬреЗрди рдорджрдж рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рд╣реИред рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирдЬрд░ рдирд╣реАрдВ рдЖрдИред рдЕрдЧрд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд╣реЛрддреЗ, рддреЛ рд╣рд╛рдБ, рд░реЗрдбрд┐рдпрд▓ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреЛ рдпрд╛ рддреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рдирд╛ рд╣реЛрддрд╛, рдпрд╛ рдлрд┐рд░ рдмреИрдЯрд┐рдХ рдкрд░ рдкреИрдЪ рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреЛ рдЦреБрдж рдкреАрдбреАрдПрдлрдЖрд░рдПрдВрдбрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХрдорд╛рддреНрд░ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╕рдВрдХреЗрдд рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдПрдВрдЯреА-рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХреЛ рднреВрд▓ рди рд╕рдХреЗрдВ, рдФрд░ рдЪрд┐рддреНрд░ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрдЯреЗред

 class SvgDrawingCtx extends DrawingCtx { private DOMImplementation domImpl; private Document doc; private SVGGraphics2D svgGenerator; SvgDrawingCtx(Dimension size) { super(size); domImpl = SVG12DOMImplementation.getDOMImplementation(); doc = domImpl.createDocument(SVGConstants.SVG_NAMESPACE_URI, SVGConstants.SVG_SVG_TAG, null); svgGenerator = new SVGGraphics2D(doc); svgGenerator.getGeneratorContext().setPrecision(4); svgGenerator.getGeneratorContext().setEmbeddedFontsOn(true); g2 = svgGenerator; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.setRenderingHint( RenderingHintsKeyExt.KEY_AVOID_TILE_PAINTING, RenderingHintsKeyExt.VALUE_AVOID_TILE_PAINTING_ON); } public void saveTo(String fn) throws Exception { Element svgRoot = svgGenerator.getRoot(); OutputStream os = new FileOutputStream(fn); if (fn.endsWith(".svgz")) os = new GZIPOutputStream(os); svgGenerator.stream(svgRoot, new OutputStreamWriter(os), false /* CSS */, true /* escaped */); os.close(); } } 


PNG: рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛


рдЫрд╡рд┐
рдпрд╣ рдпрд╣рд╛рдБ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдХреЛрдб рджреЗ рджреВрдБрдЧрд╛ред

 class ImageDrawingCtx { private BufferedImage bf = null; ImageDrawingCtx(Dimension size) { super(size); bf = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB); g2 = (Graphics2D) bf.getGraphics(); } public void saveTo(String fn) throws Exception { OutputStream os = new FileOutputStream(fn); ImageIO.write(bf, "PNG", os); os.close(); g2.dispose(); bf = null; } } 


рдЕрдм рдЪрд▓реЛ рдорд┐рдард╛рдИ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ - рдПрдХ рдПрд╕рдбрдмреНрд▓реНрдпреВрдПрдл рдмрдирд╛рдПрдВ


рдЫрд╡рд┐
рдХреЛрдб рднреА рд╕рд░рд▓ рд╣реИ (рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдлреНрд▓реЗрдХреНрд╕ рдПрд╕рдбреАрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

 class SwfDrawingCtx extends DrawingCtx { SwfDrawingCtx(Dimension size) { super(size); g2 = new SpriteGraphics2D(size.width, size.height); } public void saveTo(String fn) throws Exception { OutputStream os = new FileOutputStream(fn); flash.swf.Frame frame1; Movie m = new Movie(); m.version = 7; m.bgcolor = new SetBackgroundColor(SwfUtils.colorToInt(255, 255, 255)); m.framerate = 12; frame1 = new flash.swf.Frame(); DefineSprite tag = ((MyG2D) g2).defineSprite("swf-test"); frame1.controlTags.add(new PlaceObject(tag, 0)); m.frames = new ArrayList(1); m.frames.add(frame1); TagEncoder tagEncoder = new TagEncoder(); MovieEncoder movieEncoder = new MovieEncoder(tagEncoder); movieEncoder.export(m); tagEncoder.writeTo(os); os.close(); g2.dispose(); g2 = null; } } 

рдХреБрдЫ рднреА рдкреВрд░реНрд╡рд╛рднрд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ, рдФрд░ рдЕрдЪрд╛рдирдХред SWF рдореЗрдВ рдХреБрдЫ рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдПред

рдЧрд░реНрдо рдкреАрдЫрд╛ рдЬрд╛рдВрдЪ


рдЫрд╡рд┐
рддреЛ рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ - рдпрд╣ рдПрд╕рд╡реАрдЬреА рдореЗрдВ рд╣реИ, рдпрд╣ рдкреАрдПрдирдЬреА рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрд╕рдбрдмреНрд▓реНрдпреВрдПрдл рдореЗрдВ рдирд╣реАрдВред

рд╕реВрддреНрд░реЛрдВ рдХреА рдПрдХ рдХрд┐рд░рдг рдХреЗ рд╕рд╛рде adobe рд╕реНрд░реЛрддреЛрдВ рдХреА рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХрд┐рд░рдг рдиреЗ рдореБрдЭреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдПрдХ рдШреЛрдбрд╝рд╛ рдмрдирд╛рдпрд╛:

 class MyG2D extends SpriteGraphics2D { public MyG2D(int width, int height) { super(width, height); } public MyG2D() { super(); } @Override public boolean drawImage(Image image, AffineTransform at, ImageObserver obs) { //    return super.drawImage(image, at, obs); } } 


рдПрдХ рд╢рд╡ рдкрд░реАрдХреНрд╖рд╛ рдиреЗ рджрд┐рдЦрд╛рдпрд╛
 at.createTransformedShape(new Rectangle(0, 0, image.getWidth(), image.getHeight()).getBounds() 
рд╣рдореЗрдВ рдПрдХ 1x1 рдЖрдпрдд рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдпреВрд░реЗрдХрд╛!

  @Override public boolean drawImage(Image image, AffineTransform at, ImageObserver obs) { AffineTransform good = getTransform(); good.concatenate(at); return super.drawImage(image, good, obs); } 

рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рдЫрд╡рд┐
рдПрдХ рдкрд░реАрдХреНрд╖рдг рд░рди рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг, рдПрдХ рдЬреАрд╡рд┐рдд рдзрд╛рдЧреЗ рдкрд░ рд╕рд┐рд▓рдирд╛, 10 рдорд┐рдирдЯ рд╕реЗ рдХрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрд╖реЗрд░ рд╕реА ++ рд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЫрд╣ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рддреЗрдЬ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдирдП рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд░реЗрдХ рдФрд░ рдХреБрд▓ рддреАрди рджрд┐рдиреЛрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдЕрдм рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ, рдФрд░ C ++ рдореЗрдВ рдЗрди рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдордп рд╣реИ - рдЬрдмрдХрд┐ рдЬрд╛рд╡рд╛ рдореИрдереБрди рдХрд░ рд░рд╣рд╛ рд╣реИред

рд▓рд╛рдЧрдд: рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рд╛рде 40 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдЬрд╛рд░ рдЦреАрдВрдЪрдирд╛ рдерд╛, рдФрд░ рдореИрдВ рдЗрд╕ рдЪреАрдЬрд╝ рдХреЛ рдорд╢реАрди рдореЗрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗрдм рд╕реЗрд╡рд╛ PHP рдореЗрдВ рдереАред

Source: https://habr.com/ru/post/In153633/


All Articles