±à¼ÍƼö: |
±¾ÎÄÖ÷Òª·ÖÏí
Totoro ¿ò¼ÜÔÚÒÆ¶¯¶Ë½ØÍ¼¼°Í¼Ïñ´¦Àí¼°ÔÚÈ«Á´Â·ÌåϵÉϵļ¼Êõ·½°¸ºÍÒµÎñÖ§³ÖÄÜÁ¦£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚÔÆÆÜÉçÇø £¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
ΪÌá¸ßÒµÎñÑз¢µÄ¿ª·¢Ð§ÂÊ£¬½â¾öÒµÎñ»ù´¡¹¤¾ß¼¼ÊõÍ´µã£¬ÈÃÑз¢Ö÷Òª¾«Á¦»Ø¹éÒµÎñºËÐÄÎÊÌâ½â¾öÉÏ£¬ÎÒÃÇÔÚ²»Í¬µÄά¶È×öÁË´óÁ¿Ìåϵ»¯µÄ¼¼Êõ¹¹½¨£¬Îª²»Í¬µÄ×Ô¶¯»¯³¡¾°ÌṩÎȶ¨¡¢Ò×ÓõÄ×Ô¶¯»¯µ×ÅÌ¡£
»ù´¡½ØÍ¼¼¼Êõ·½°¸
һ̨ÊÖ»úÉÏ»ñÈ¡ÆÁÄ»½ØÍ¼¼òµ¥£¬µ«ÊÇÏëÒª¼æÈݼ¯Èº»·¾³ÔÆÕæ»úƽ̨ÉϵĴóÁ¿Òƶ¯É豸£¬Í»ÆÆÏµÍ³¸÷ÖÖ°²È«ÏÞÖÆ¡¢°²È«Ò³Ã棨ÃÜÂ롢תÕ˵ÈÒ³Ãæ£©·´½ØÍ¼°²È«ÏÞÖÆ¡¢¼°
ROM ²îÒìÐԵȲ»Í¬Î¬¶ÈµÄ¼æÈÝÐÔÎÊÌ⣬ÇÒÊÇ·ÇÇÖÈ뷽ʽ£¬Ôò»áÓÐÒ»µã¼¼ÊõСÌôÕ½¡£
ÕâÀï´Ó»ù´¡½ØÍ¼·½°¸ºÍÍ»ÆÆÏµÍ³ÏÞÖÆ´ïµ½½ØÍ¼ÄÜÁ¦È«³¡¾°¸²¸ÇÁ½·½Ãæ·ÖÏí Totoro µÄһЩʵ¼ù¡£
1. Ò»°ã³£¼û½ØÍ¼·½°¸Ñ¡Ðͼ°¸ÄÔì
ÔÚÒÆ¶¯¶Ë×Ô¶¯»¯(²âÊÔ)³¡¾°, ×¼ûµÄ½ØÍ¼·½·¨¾ÍÊÇʹÓÃadb shell screencap»òuiautomator½ØÍ¼½Ó¿Ú¡£È»¶ø
adb shell screencap ·½Ê½Ê¹Óúܲ»·½±ã£¬ÐèÒª½«½ØÍ¼Ïȱ£´æµ½ÊÖ»ú´ÅÅÌÉÏ£¬È»ºóÔÙpullµ½
PC É豸ÉÏ¡£
Totoro ¿ò¼ÜÖвÉÓÃÁËÒ»´ÎÐԵĻñÈ¡·½Ê½ÈçÏ£º
adb -s sn exec-out
screencap -p > name |
µ«ÊǼ´Ê¹²ÉÓÃadb exec-out·½Ê½Ò²´æÔÚͼƬÎÞ·¨Ñ¹Ëõµ¼ÖµĽØÍ¼ºÄʱ½Ï³¤µÄÎÊÌ⣬²¢ÇÒ Java
ÏîÄ¿ÖÐÿ´Î¶¼Òª Process ´´½¨½ø³Ì£¬Óöµ½Æµ·±½ØÍ¼Çé¿ö£¬ºÄ·Ñϵͳ×ÊÔ´£¬Ó°ÏìÎȶ¨ÐÔ¡£ËùÒÔÔÚ Totoro
¿ò¼ÜÖÐÌṩµÄ SDK ĬÈÏ API µ×²ã²ÉÓõĵÄÊÇ Uiautomator ÌṩµÄ½Ó¿Ú·½·¨¡£
UI Automator ²âÊÔ¿ò¼ÜÌṩÁËÒ»×é API£¬ÓÃÓÚ¹¹½¨ÔÚÓû§Ó¦ÓúÍϵͳӦÓÃÉÏÖ´Ðн»»¥µÄ½çÃæ²âÊÔ¡£Í¨¹ý
UI Automator API£¬Äú¿ÉÒÔÖ´ÐÐÔÚ²âÊÔÉ豸Öдò¿ª¡°ÉèÖᱲ˵¥»òÓ¦ÓÃÆô¶¯Æ÷µÈ²Ù×÷¡£
ͬÑù·¢ÏÖ£¬UIAutomator ÌṩĬÈϽØÍ¼·½·¨ Éú³ÉͼƬÎļþÒ²ÊǷdz£´ó£¬Ñ¹ËõËã·¨²¢Ã»ÉúЧ¡£µ¼Ö½ØÍ¼Á´Â·ÉÏÕûÌåºÄʱ»áÔì³Éÿ´Î½ØÍ¼ÔÚÆ½¾ù
2-5s ×óÓÒ£¬Ó°Ïìµ½ÁË×Ô¶¯»¯ÕûÌåʱ¼ä¡£ ¿¼Âǵ½µ¥¶ÀÒý½øÒ»Ì×ѹËõËã·¨½ÏÖØ£¬ÇÒ¿ÉÄܺóÐøÎÞ×ÊԴά»¤£¬ËùÒÔ¾ö¶¨Ñо¿°²×¿Ô´Â룬ÊÔͼ´Ó¸ù±¾½â¾öѹËõÎÞЧµÄÎÊÌâ¡£
/**
* Write a compressed version of the bitmap to
the specified outputstream.
* If this returns true, the bitmap can be reconstructed
by passing a
* corresponding inputstream to BitmapFactory.decodeStream().
Note: not
* all Formats support all bitmap configs directly,
so it is possible that
* the returned bitmap from BitmapFactory could
be in a different bitdepth,
* and/or may have lost per-pixel alpha (e.g. JPEG
only supports opaque
* pixels).
*
* @param format The format of the compressed image
* @param quality Hint to the compressor, 0-100.
0 meaning compress for
* small size, 100 meaning compress for max quality.
Some
* formats, like PNG which is lossless, will ignore
the
* quality setting
* @param stream The outputstream to write the
compressed data.
* @return true if successfully compressed to the
specified stream.
*/
public boolean compress(CompressFormat format,
int quality, OutputStream stream) {
...
}
public boolean takeScreenshot(File storePath,
int quality) {
Bitmap screenshot = mUiAutomation.takeScreenshot();
...
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(storePath));
screenshot.compress(Bitmap.CompressFormat.PNG,
quality, bos);
}
...
return true;
} |
¸ù¾ÝÒÔÉϰ²×¿Ô´Â룬¸ú×Ùµ½ÏµÍ³Ñ¹Ëõ·½·¨¡£¿´×¢ÊÍ£¬Ëƺõ·¢ÏÖÁËÎÊÌâËùÔÚ£¬¿´ takeScreenshot
·½·¨, µ÷ÓÃÁË Bitmap µÄ Compress ѹËõ·½·¨£¬´«µÄ²ÎÊýдËÀÁË Bitmap.CompressFormat.PNG,¸ñʽ£¬¸ù¾Ý×¢ÊÍ˵Ã÷£¬Compress
·½·¨ÓÖ¶Ô png ¸ñʽͼƬµÄѹËõºöÂԵģ¬ËùÒÔµ¼Ö»ñÈ¡µ½µÄͼƬ¶¼ºÜ´ó¡£ÂíÉÏÖØÐ´ÏµÍ³·½·¨£¬Ö±½Óµ÷ÓÃѹËõ·½·¨£¬´«Èë
JPEG È¥ÑéÖ¤¿ÉÐÐÐÔ£¬ÂíÉϵóöÁ˽â¾ö·½°¸¡£
ÕÒµ½ÎÊÌâËùÔÚ£¬½â¾ö·½°¸Ò²¾Í³öÀ´ÁË£¬Ö÷Òª¸ÄÔìÂß¼¿ÉÒÔͨ¹ýÈý¸öºËÐIJ½ÖèÍê³É£º
×ÔÐлñÈ¡ Bitmap Îļþ¡£
µ÷Óà Bitmap ѹËõ·½·¨£¬Ö¸¶¨ jpeg ¸ñʽ£¬²¢´«Èë×Ô¶¨ÒåѹËõÖµ¡£
»ñȡѹËõÁ÷Êý¾Ý£¬Ö±½Ó Base64 ±àÂë´«µÝ¸ø SDK ²ã¡£
ͨ¹ýÒÔÉÏÓÅ»¯£¬¼õÉÙÁËÁ½´ÎÎļþ¶Áд£¬²¢ÇÒÓÐЧѹËõÁËͼƬ´óС£¬ÕûÌåÒ»´Î½ØÍ¼Ê±¼ä¿ØÖÆÔÚÁË 200-800ms£¬¶Ô±ÈÔÀ´ËÙ¶È×îÉÙÌáÉý
2-3 ±¶ÒÔÉÏ¡£
2.Í»ÆÆÏµÍ³°²È«ÏÞÖÆ×öµ½½ØÍ¼È«¸²¸Ç
Totoro µÄ×î´óÒµÎñÐèÇó À´×Ô Ç®°üϵ Ïà¹Ø App µÄ×Ô¶¯»¯ÒµÎñ£¬¶øÖ§¸¶±¦ÊôÓÚ°²È«Òþ˽ҪÇó½Ï¸ß
App£¬¸÷¸ö ROM Õë¶ÔÇ®°ü»òÕßÇ®°ü×ÔÉí¶¼»á×ö´óÁ¿°²È«±£»¤£¬ÀýÈçÔÚÃÜÂëÊäÈëÒ³Ãæ»òתÕËÒ³Ãæ£¬»áµ¼Ö½ØÍ¼»ñȡʧ°Ü£¬²¢ÇÒÎÒÃÇ·¢ÏÖÓÐЩÏÞÖÆ¼¶±ð½Ï¸ßÒ³Ãæ£¬Á¬ÏµÍ³×ÔÉíµÄ½ØÍ¼¹¦ÄÜÒ²ÎÞ·¨Ê¹Óá£
µ«ÊÇÔÚ²âÊÔ³¡¾°Ï£¬Êý¾Ý¼°°²È«¼¶±ðÊǿɿص쬶à¸öÒµÎñÏßÇ¿ÁÒÌá³ö ÄÜ·ñͨ¹ý¼¼ÊõÊÖ¶Î »ñÈ¡µ½ÕâЩ±»ÏÞÖÆµÄÒ³Ãæ½ØÍ¼£¬À´Âú×ãÒµÎñÑéÖ¤Âß¼µÄÕýÈ·ÐÔ£¬È¥³ýÈ˹¤Ò³Ãæ½ØÍ¼ÉóºËËÀ½Ç£¬À´½øÒ»²½Ìá¸ßÑз¢Ð§ÄÜÖÊÁ¿¡£
ÓÉÓÚ Totoro ¿ò¼ÜÊÇ¶Ô App ÊÇ·ÇÇÖÈëʽµÄ£¬Ò²¸øÎÒÃǵļ¼ÊõʵÏÖÌí¼ÓÀ´²»Ð¡ÌôÕ½¡£µ«ÊÇ£¬±¾×ÅÒµÎñ¼ÛÖµÊ×λ¿¼ÂÇ£¬ÎªÁ˱£ÕÏ¿ª·¢ÕßʹÓÃЧÂÊ£¬ÎÒÃÇ¿ªÊ¼µ÷Ñа²×¿¸÷ÖÖ½ØÍ¼·½°¸£¬¸ú×Ù°²×¿½ØÍ¼Ô´Â룬ÊÔͼ²ÉÓÃHook·½Ê½Èƹý°²È«Ð£Ñé»úÖÆ¡£
Õë¶Ô°²×¿Æ½Ì¨¸÷ÖÖÈ«¾Ö½ØÍ¼·½·¨µÄÉîÈëÑо¿£¬×îºó·¢ÏÖ£¬¸÷ÖÖÈë¿ÚÀàµÄϵͳ½Ó¿Úµ÷Óõ½µ×²ã¶¼»áµ÷ÓÃSurfaceControlÀà»ò¶ÔÓ¦µÄ
c ²ã´úÂ룬 SurfaceControl Àà³ÉÁ˹ؼüÑо¿¶ÔÏó¡£È»¶ø£¬´Ó Java ²ãµÄ SurfaceControl
ÀàÖи÷ÖÖ Hook ½Ó¿Úµ÷Óó¢ÊÔ·¢ÏÖ£¬Ö»Òª±»°²È«Ò³ÃæÏÞÖÆ£¬¸Ã·½°¸ÏµĽØÍ¼·½°¸¾Í»áʧ°Ü»ò½Øµ½Ò»ÕÅºÚÆÁ¡£ÕâÒâζ×ÅϵͳÕë¶Ô½ØÍ¼µÄ°²È«ÏÞÖÆ¿ÉÒÔ¸²¸Çµ½Ä¿Ç°ÎÒÃÇÁ˽⵽µÄÈκγ¡¾°£¬ÈÃÎÒÃǵĽâ¾ö·½°¸Ò»Ê±ÏÝÈëÀ§¾³£¬Ê§È¥ÁË˼··½Ïò¡£
È»¶øÔÚ×ö SLM ÔÆ²âƽ̨É豸Զ³Ì×âÓùý³ÌÖУ¬·¢ÏÖ¼ÆÁ¹¦ÄÜÔÚÕâЩ½ØÍ¼ÏÞÖÆÒ³ÃæÒÀÈ»ÊÇ¿ÉÒÔÕý³£Ê¹Óã¬Õâ˵Ã÷ϵͳ»ò°²È«ÏÞÖÆÖ»ÊÇÕë¶Ô½ØÍ¼Ïà¹Ø
API£¬Õâ¸øÎÒÃǵĽØÍ¼ÌṩÁËеÄ˼·£¬Í¨¹ý¼ÆÁÀ´»ñÈ¡ÆÁÄ»½ØÆÁ¡£ËùÒÔ¿ªÊ¼Ñо¿ÏµÍ³µÄ¼ÆÁ¹¦ÄÜ£¬ÄÜ·ñÔÚ¼ÆÁ¹ý³ÌÖÐÀÒ»Ö¡µÄ»Ã棬×÷Ϊ½ØÍ¼ÐµÄʵÏÖ·½Ê½¡£
A.×ÔÑм¼Êõ·½°¸
ʵÏÖÔÀíºÜ¼òµ¥£¬Í¨¹ýÖ±½Ó½âÂë Surface »ñÈ¡ÆÁÄ»ÊÓÆµÁ÷£¬È»ºó´ÓÊÓÆµÖлñȡһÕÅ¿ÉÓÃÖ¡£¬×ª»»Îª JPEG
¸ñʽ£¬×îºó»Ø´«¸ø PC ÉϵĽӿڡ£¸Ã·½°¸´Ó Java ²ãʵÏÖ£¬¼æÈÝÐÔÇ¿£¬³É±¾µ×£¬ÏÂÃæÊǹؼü´úÂëÂß¼£º
MediaCodec mcodec
= MediaCodec.createEncoderByType("video/avc");//´´½¨½âÂëÆ÷
Surface surface = codec.createInputSurface();//¹¹ÔìÄ¿±êSurface
SurfaceControl.setDisplaySurface(display, surface);//ͨ¹ý·´ÉäSurfaceControl£¬½«¹¹ÔìµÄSurfaceÉèÖõ½ÏµÍ³
int outputBufferId = codec.dequeueOutputBuffer(bufferInfo,
-1);//¿ªÊ¼½âÂë
//ÅжÏÓÐЧ֡
...
Bitmap bitmap = mediaMetadataRetriever.getFrameAtTime(index);//»ñÈ¡ÆÁÄ»bitmapÖµ
bitmap.compress(Bitmap.CompressFormat.JPEG, quailty,
fos);//±£´æ½ØÍ¼
...
//½ØÍ¼»Ø´«µ½PC½Ó¿Ú²ã |
È»ºó¾ÍÊÇ´ò°ü³ÌÐò£¬ÀûÓÃϵͳ app_process ·þÎñ£¬¿ÉÒԱܿª¸÷ÖÖȨÏÞµ¯´°ÎÊÌ⣬ֱ½ÓÔËÐгÌÐò£¬¼´¿É»ñÈ¡µ½ÆÁÄ»½ØÍ¼¡£
Ŀǰ¸Ã·½Ê½ÒÑÈ«ÃæÓ¦Óõ½ Totoro µ×²ã½ØÍ¼·½°¸£¬¿ÉÒÔ¼æÈݰ²×¿ 5.0-10 °æ±¾£¬µ«ÊÇÈÔÈ»ÓиĽøµØ·½£¬ºóÐø»¹¿É´ÓÒÔϼ¸µã½øÒ»²½ÓÅ»¯£º
ÊÓÆµÁ÷ÓÐЧ֡ÅжÏÂß¼ÓÅ»¯£¬¼õÉÙ½ØÍ¼Ê±¼ä¡£
ĿǰÈÔÈ»ÐèÒªÒ»´ÎÊÖ»ú¶ËµÄÎļþ±£³Ö¶ÁдÂß¼£¬ºóÐø¿É¿¼ÂǶÁÁ÷·½Ê½£¬Ö±½Ó»ñȡͼƬ Base64 Öµ¡£
¿ÉÖ´ÐÐÎļþ²ÎÊý±ê×¼»¯£¬¿ÉÂú×ã¶à³¡¾°¼¼ÊõÊä³ö¡£
B.±¸Óöµµ×·½°¸
ÒÔÉÏ A ·½·¨Ö÷ÒªÕë¶Ô 5.0+ µÄ°²×¿É豸£¬ÇÒÕë¶Ô¸ö±ð OPPO¡¢VIVO É豸¿ªÆôÁËϵͳ¶ñÒâ¼ÆÁ¹¦ÄÜ£¬¾Í»áÔì³É¼ÆÁ¹¦ÄÜÏÞÖÆ£¬ÒýÆð½ØÍ¼Ê§°Ü¡£Õë¶ÔÕⲿ·ÖµÄÉ豸£¬ÎÒÃÇÉèÏë
Android ÄÜ·ñÏñ Linux ϵͳһÑù£¬Èƹý Java ²ãȨÏÞÏÞÖÆ£¬Ö±½Ó´ÓC²ã¶ÁÈ¡²Ù×÷ϵͳ framebuffer£¨Linux
É豸/dev/graphics/fb0£©£¬À´»ñÈ¡ÆÁĻͼÏñ¡£
ÆÚ¼äµ÷ÑÐÁË¿ªÔ´µÄ minicap ¼ÆÁ·½°¸£¬·¢ÏÖ Surface ·½°¸ÔÚ¸ö±ðÉ豸²»ÄܼæÈÝÇé¿öÏ£¬
minicap ÒÀÈ»¿ÉÒÔʹÓã¬Æäµ×²ãÔÀí¾ÍÊDzÉÓà NDK ¿ª·¢µÄ¹¤¾ß£¬Ö±½Ó¶ÁÈ¡²Ù×÷ϵͳ framebuffer£¬ÎªÁ˲»Öظ´ÔìÂÖ×Ó£¬¾ö¶¨°Ñ
minicap ¹¤¾ßÖеÄÊÖ»ú¶ËµÄ·þÎñµ¥¶À°þÀë³öÀ´¼¯³Éµ½ Totoro£¬×÷Ϊ±¸Óöµµ×·½·¨Ìṩ½ØÍ¼ÄÜÁ¦¡£
String cmd =
String.format("adb -s %s shell LD_LIBRARY_PATH=/data/local/tmp
/data/local/tmp/minicap -P %sx%s@%sx%s/0 -Q 90
-s -t > %s", deviceId, w, h, w, h, localPathFile);
|
°´ÕÕÉÏÃæÃüÁîµ¥¶Àµ÷Óà minicap ¹¤¾ß½ØÍ¼£¬²¢´ÓÁ÷ÖнâÎöµ½Í¼Æ¬±£³Öµ½Öƶ¨Ä¿Â¼£¬¾´óÁ¿²âÊÔ£¬¸ÃÃüÁî²¢²»Ò»¶¨Îȶ¨£¬ÓÐʱ»á±¨¸ñʽ´íÎó£¬ÓÐʱ»á±¨Á÷´¦Àí´íÎó£¬ËùÒÔÎÒÃÇÌí¼ÓÁ˽µ¼¶·½°¸£¬ÈçÒÔÏÂÃüÁî¡£
String cmd =
String.format("adb -s %s shell \"LD_LIBRARY_PATH=/data/local/tmp
/data/local/tmp/minicap -P %sx%s@%sx%s/0 -Q 90
-s -t > /sdcard/.totoro/%s\"", deviceId,
w, h, w, h, name);
//È»ºó½«Í¼Æ¬Pullµ½PCÉÏÖÆ¶¨Ä¿Â¼ |
Á½ÖÖ¼¼Êõ·½°¸Ï໥½µ¼¶´îÅäʹÓã¬ÕâÑùÕýºÃÃÖ²¹ÁË Java ²ã Surface ·½°¸µÄһЩ¿ÉÄÜʧ°Ü³¡¾°£¬×÷Ϊ¶µµ×·½·¨¼¯³Éµ½ÁË
Totoro ¿ò¼ÜÖУ¬Ä¿Ç°ÎªÖ¹ÔÝδ·¢ÏÖÁ½ÖÖ·½·¨¶¼Ê§°Ü³¡¾°£¬±£ÕÏÁ˽ØÍ¼ÄÜÁ¦µÄµ×ÅÌÎȶ¨ÐÔ¡£
ÒµÎñ¶à³¡¾°Ö§³Ö
1.»ù´¡½ØÍ¼³¡¾°
ͨ¹ýÒÔÉÏÏà¹Ø¶à²ã¼¼Êõ·½°¸¼æÈÝ£¬Totoro Ŀǰ¿ÉÒÔÌṩÎȶ¨µÄ»ù´¡½ØÍ¼ÄÜÁ¦£¬ÒµÎñ²ãÎÞÐè¹Ø×¢µ×²ãµÄ¾ßÌå¼¼ÊõʵÏÖ·½°¸»ò¶µµ×·½°¸£¬Ö»ÐèÒªµ÷ÓÃÒ»¸ö
Totoro ʵÑé SDK ±©Â¶µÄ API ¼´¿É¡£
String path =
BizUtils.saveScreen(name); |
2.³¤½ØÆÁ¼¼Êõ·½°¸
³¤½ØÍ¼ÄÜÁ¦Ò»Ö±ÊÇÒµÎñ·½Ìá³öµÄÍ´µãÐèÇó£¬Ò»Ö±µ½ 19 ÄêÄ©ÎÒÃDzųé³öʱ¼äÃÖ²¹ÁË Totoro Õâ¿éÄÜÁ¦È±Ê§¡£
ÆðÏÈ£¬Ïȵ÷ÑÐÁËÐÐÒµÄÚÆäËûʵÏÖ·½°¸£¬»ù±¾Ë¼Â·¶¼ÊÇ»¬¶¯½ØÍ¼£¬È»ºóºÏ²¢¶àÕŽØÍ¼£¬×îºóÉú³É³¤½ØÍ¼¡£È»¶ø£¬ÄѵãÔÚ¶àÕŽØÍ¼µÄÍêÃÀºÏ²¢£¬Õë¶ÔÒÆ¶¯¶ËµÄÒ³Ãæ½ØÍ¼£¬´æÔÚҳͷ¡¢Ò³Î²¡¢Ð¡
banner ¸üС¢Ð¡ºìµãµÈ¶àÖØÓ°Ï죬¸ø³¤½ØÍ¼µÄʵÏÖÔö¼ÓÁ˲»ÉÙÄѶȡ£
¿ÉÐз½°¸·ÖÎö£º
Ö±½ÓÀûÓõÚÈý·½Æ´½Ó¹¤¾ß¡£ÐèÒªÌí¼Ó¶îÍâÒÀÀµ£¬ÆäÔÚÒÆ¶¯¶Ë¸ö±ð¼«ÏÞ³¡¾°Æ´½Ó´æÔÚÎÊÌ⣬ά»¤³É±¾¸ß¡£
ÀûÓÃËã·¨²¿ÃÅ×ÊÔ´£¬ÌØÕ÷ÖµÖ±½ÓÆ¥Åä¡£ÐèÒªÌí¼ÓËã·¨¿â£¬ÇÒÒªÍÆ¶¯Ëã·¨²¿ÃŲ»¶Ïµü´ú¸üУ¬ºóÐø¸üпÉÄܲ»¼°Ê±¡£
×Ô¼ºÊµÏÖÒ»Ì×£¬ÄѶȴ󣬳õÆÚ³É±¾¸ß¡£ÐèÒª¼æÈÝÒÆ¶¯¶ËÒ³Ãæ¸÷ÖÖÇé¿ö£¬µ«ÊǺóÐøÎ¬»¤³É±¾µÍ£¬Éý¼¶·½±ãÇÒ¼°Ê±¡£
ȨºâÀû±×ºó£¬×îÖÕÎÒÃDzÉÓÃÁË·½°¸ 3£¬¾ö¶¨×Ô¼ºÊµÏÖÁËÒ»Ì×Õë¶ÔÒÆ¶¯¶Ë½ØÍ¼ÌØÕ÷µÄÆ´½ÓÄÜÁ¦£¬²ÉÓÃÁË×ÔÑÐÏñËØÐлҶÈֵĩβÓÅÏȶԱȼ¼Êõ·½°¸£¬ºËÐÄÂ߼˼·ÊÇĬÈÏÏòÉÏ»¬¶¯Éú³ÉµÄͼƬ×飬Á½Á½´Óµ×²¿ÓÅÏÈ¿ªÊ¼¶Ô±ÈÐÐÏñËØµÄ»Ò¶ÈÖµ£¬ÕÒµ½Æ´½ÓµãºÍ²Ã¼ôµã¡£ÎªÁ˼õÉÙÔëµã¼°¸ö±ðºìµã¡¢ºìÏß¡¢Ð¡
banner¡¢¼°µ×²¿µ¼º½À¸Ó°Ï죬ÔÚ²»Í¬µÄ¶Ô±Èµã¼°ÇøÓòÌí¼ÓÁ˶ÔÓ¦µÄ²ÎÊý¡£ÆäºËÐÄ´úÂë˼·ÈçÏ£º
public static
File mergeImg(File imgA, File imgB, String mergedImgPathName)
{
int[][] listA = getPX(imgA);//»ñÈ¡ÏñËØÊý×é
int samePartEnd = 0, sameBottom = srcALen;//¶¨Òå²éÕÒÄ¿±êλÖÃ
int samePart = mergeLen >> 2;//¶¨ÒåÏàËÆ¿ÅÁ£
for (int al = Math.max(0, listA.length - mergeLen
+ (samePart >> 1)), l = listA.length - 1;
l >= al; l--) {
for (int x = mergeLen - (listA.length - l), y
= Math.max(0, (samePart >> 1)); x >=
y; x--) {
if (compareRowPx(listA[l], listB[x])) {// ¶Ô±ÈÐлҶÈÏàËÆ¶È
//ÕÒµ½»ù´¡¶Ô±Èµã
for (int i = 0, partLen = (l == listA.length -
1) ? samePart : samePart >> 1; i < partLen;
i++) {
//ѰÕÒÆ´½Óµã
if (compareRowPx(listA[curA], listB[curB])) {
if (i == partLen - 1) {
//ÏàÍ¬ÇøÓò´ïµ½·§Öµ£¬ÕÒµ½Æ´½Óµã
samePartEnd = x;
sameBottom = l - 1;
break;
} else {
//ѰÕҵײ¿ÏàÍ¬ÇøÓò£¬Èçµ×²¿µ¼º½TabÀ¸
break;
}
}
if (matchedBottom || samePartEnd > 0) {
//Æ´½Ó²ÎÊýÕÒµ½£¬ÌáÈ¡½áÊøÑ»·
break;
}
}
}
}
String fileSuffixA = getFileRealExt(imgA);//¶ÁÈ¡¶þ½øÖÆÁ÷£¬»ñÈ¡ÔʼͼÎļþÕæÊµºó׺
String fileSuffixB = getFileRealExt(imgB);
String fileSuffixC = mergedImgPathName.substring(1
+ mergedImgPathName.lastIndexOf("."));
if (samePartEnd == mergeLen - 1) {
//ͼƬÏàͬ£¬Ö±½Ó·µ»ØµÚÒ»ÕÅͼƬ
imgA.renameTo(file);
return file;
}
//¿ªÊ¼ºÏ²¢Âß¼
int newY = srcALen - (srcALen - sameBottom)
+ (mergeLen - samePartEnd);
...//¶ÁÈ¡ÔʼͼƬֵ
if (sameBottom > 0) {
// È¥³ýµ×²¿µ¼º½tabÀ¸
} else {
//ûÓеײ¿²Ù×÷tabÀ¸
newA = reader.read(0);
}
...//ÖØÐÂÆ´½ÓͼƬ
imgNew.setRGB(0, newA.getHeight(), width, newB.getHeight(),
imgArrayB, 0, width);
ImageIO.write(imgNew, fileSuffixC, file);
..//ÆäËû×ÊÔ´»ØÊÕ
return file;
} |
Ч¹ûͼÈçÏ£º

¸Ã·½°¸Ä¿Ç°ÒÑÈ«Á¿ÉÏÏߣ¬²¢ÇÒÂú×ãÁËĿǰҵÎñ·½ÐèÇó£¬ÔÚÓöµ½³¤½ØÍ¼Æ´½ÓÓÐÖØµþ»òȱÉÙÎÊÌâʱ£¬Ò²¿ÉÒÔͨ¹ýµ÷½Ú¶Ô±È²ÎÊý£¬¿ìËÙÓÅ»¯ºÏ²¢Âß¼´úÂ룬´ïµ½Á˼ȶ¨Ñз¢Ä¿±ê¡£
3.¾Ö²¿¿Ø¼þ½ØÍ¼
ÔÚ×Ô¶¯»¯¹ý³ÌÖУ¬ÓÐЩҵÎñÐèÒª»ñȡij¸ö¿Ø¼þµÄ½ØÍ¼£¬ iOS ¶Ë¿ÉÒÔͨ¹ý WDA Ïà¹Ø½Ó¿ÚʵÏÖ£¬µ«Êǰ²×¿¶ËÊÇûÓÐÏֳɷ½°¸µÄ¡£Òò´Ë£¬Totoro
²ÉÓÃÁ˰´ÕÕ×ø±ê½ØÍ¼Çиʽ£¬½áºÏ¿Ø¼þ×ø±êÐÅÏ¢£¬¿ÉÒÔÔÚ PC ¶ËʵÏÖÒ»Ì×¾Ö²¿¿Ø¼þ»ñÈ¡·½·¨¡£¸Ã API
¿ÉÒÔͬʱÊÊÓõ½
iOS ºÍ°²×¿Ë«Æ½Ì¨£¬¾Ö²¿¿Ø¼þ½ØÍ¼ºËÐÄʵÏÖ˼·£º
src = BizUtils.saveScreen(name);
WebElement element = driver.findElement(By);
...//¸ù¾Ýelement»ñÈ¡µ½elementµÄ×ø±êÐÅÏ¢
ImageCheckUtils.imageCut( src, dest, x, y, width,
height);//¸ù¾Ý×ø±êÐÅÏ¢ÇÐͼ£¬»ñÈ¡µ½¿Ø¼þ½ØÍ¼destÎļþ |
4.¶àÆÁÄ»½ØÆÁ
Ŀǰ Totoro ÖÐÖ»¼¯³ÉÁË adb ÔÉú·½Ê½£¬ÓÃÀ´ÎªÒ»Ð©Ö§¸¶ IoT É豸£¬Ìṩ¶àÆÁÄ»½ØÍ¼ÄÜÁ¦¡£
#¸½ÆÁÄ»½ØÆÁ
adb shell screencap -d /dev/graphics/fb1 fb1.png
#Ö÷ÆÁÄ»½ØÆÁ
adb shell screencap -d /dev/graphics/fb0 fb0.png
|
ºóÐø¸ù¾ÝÐèÇó·´À¡£¬»áµ÷ÑвÉÓà UIAutomater »ò Surface ·½Ê½ÊµÏÖ¡£
ͼÏñÖÇÄÜËã·¨·ÖÎö
Totoro ½èÖúÐÖµÜÍŶӣ¨¹¤³ÌÊý¾Ý¼¼Êõ×飩µÄËã·¨ÄÜÁ¦£¬Õë¶Ô½ØÍ¼ÊµÏÖÁËÒ³ÃæÖÇÄÜ·ÖÎö¡¢¼ì²âµÈÄÜÁ¦£¬Íê³ÉÁËͼƬÏà¹Ø¼¼ÊõÌåϵС±Õ»·¡£ÖÇÄÜËã·¨ÄÜÁ¦¼¯³É¿ÉÒÔ¹éÀàΪÒÔÏÂÈýÖÖ¡£
1.¿Ø¼þ·ÖÎö

ÈçÉϽØÍ¼Ëùʾ£¬¿ÉÒÔͨ¹ýÒÔÏ API »ñÈ¡Ò³Ãæ¿Ø¼þÐÅÏ¢£¬¿Éʶ±ð¿Ø¼þÀàÐÍÈç button¡¢image¡¢label¡¢progress¡¢switch¡¢more¡¢editView¡¢popUp¡¢checkBox¡¢return¡¢close
µÈ¡£
2.Ò³ÃæÒì³£¼ì²â
Òì³£¼ì²âÄÜÁ¦¿É³éÏó·ÖΪͨÓÃÒì³£ºÍÒµÎñÒì³££¬¾ßÌå˵Ã÷ÈçÏ£º
ͨÓÃÒì³£·ÖÎö£¬È磺ºÚ°×ÆÁ¡¢¼ÓÔØÊ§°Ü¡¢Í¼Æ¬»òÎÄ×ֽضϣ¬¿Ø¼þÅÅÁÐÖØµþµÈ³£¼ûÒ³Ãæ UI ÎÊÌ⣻
ÒµÎñÒì³£·ÖÎö£¬È磺ҵÎñµ¯´°¡¢ÊÚȨµ¯´°×è¶ÏµÈ£¬ÇÒ¸ü¼Ó²»Í¬µÄÒµÎñÒì³£³¡¾°ÐèÇ󣬿ɶ¨ÖÆ»¯·þÎñ¡£
Totoro ÖпÉͨ¹ýÒ»¸ö½Ó¿Ú»ñÈ¡Ò³ÃæÒì³£ÐÅÏ¢£¬ÒµÎñÖÐͨ¹ý×Ô¶¯»¯µÄ¼ì²â£¬Íê³ÉÁË֮ǰºÜ¶àÎÞ·¨ÊµÏÖµÄ×Ô¶¯»¯³¡¾°¡£
3.ÒµÎñ³¡¾°Ê¶±ð
ΪʵÏÖ¸ü¼ÓÖÇÄܵÄÒ³Ãæ·ÖÎö£¬ÎªºóÐø×Ô¶¯»¯²âÊÔ³¡¾°ÖÐ×Ô±éÀú»ò×ÔÌî³äÌṩ»ù´¡ÄÜÁ¦Ö§³Å£¬ÒÀÀµËã·¨ÄÜÁ¦¿ÉÒÔÖÇÄÜ·ÖÎöµ±Ç°Ò³Ã泡¾°£¬ÀýÈç¿ÉÒÔͨ¹ýËã·¨Ïà¹Ø½Ó¿ÚÀ´×Ô¶¯Åжϵ±Ç°Ò³ÃæÊôÓÚÄĸöÒµÎñÁ÷³Ì£¬±ÈÈçµÇ¼Á÷³Ì³¡¾°¡¢ÊäÈ볡¾°µÈ¡£
ĿǰÄÚ²¿Ö»¿ª·ÅÁ˵Ǽ³¡¾°µÄʶ±ð£¬ÒÑÉÏÏß²¢Ó¦Óõ½Ð¡³ÌÐò×Ô¶¯»¯×¢È뼰Ѳ¼ì³¡¾°£¬¿ÉÒÔ´úÌæÐ¡³ÌÐòµÇ¼·±Ôӽű¾¹¤×÷Á¿£¬´ó´ó¼õÉÙÓÃÀý½Å±¾Î¬»¤³É±¾¡£
4.ͼƬÏàËÆ¶È·ÖÎö

ÈçÉÏÁ½ÕŽØÍ¼£¬ÓÉÓÚ´æÔÚ´óÃæ»ý Banner ±ä»¯ºÍ±³¾°½¥±äÑÕÉ«²îÒ죬Èç¹ûµ¥´¿Í¨¹ýÏñËØ¶Ô±È£¬ºÜÄÑ·ÖÎö³öÊÇÒ»¸öÒ³ÃæÉϵĽØÍ¼£¬ÕâÀïÖ÷Òª½èÖúËã·¨ÄÜÁ¦£¬Í¨¹ýÌáÈ¡Ò³ÃæÌØÕ÷Öµ¡¢Í¼ÏñÖ¸ÎÆ¡¢ÑÕɫͨµÀµÈ¶àά¶ÈÀ´¾«È·¼ÆËã³öÁ½¸ö½ØÍ¼µÄÏàËÆ¶È¡£

ÈçÒÔÉϽØÍ¼Ëùʾ£¬¿ÉÒÔͨ¹ý Totoro ·â×°µÄ API µÃ³öÁ½ÕÅͼÏàËÆ¶ÈΪ 54£¬ÒµÎñ²ã´úÂë¿Éͨ¹ýÏàËÆ¶ÈÓ¦Óõ½×Ô¼ºµÄʵ¼ÊÒµÎñ³¡¾°¡££¨Ö»ÒªÏàËÆ¶È
>=50 Ôò¿ÉÈÏΪÁ½¸ö½ØÍ¼ÊÇÒ»¸öÏàËÆÒµÎñ³¡¾°£©
ºóÐø¼Æ»®
Õë¶ÔºÜСµÄÒ»¸öͼƬҵÎñÄÜÁ¦£¬¶¼ÐèҪͶÈëÁ¿¾Þ´óµÄŬÁ¦ À´±£ÕÏ Totoro µÄ×Ô¶¯»¯µ×ÅÌÒ×ÓÃÐÔºÍÎȶ¨ÐÔ£¬ÒµÎñ²»¶ÏÀ©ÕŹý³ÌÖУ¬Í¼Æ¬Ïà¹ØÄÜÁ¦Ìåϵ»¹ÊÇÓжà¸öϸ½ÚÈÔÐèÒª²»¶Ïµ÷ÓÅ£¬ÆäÖÐÃ÷È·ÐèҪͶÈëÑо¿ºÍºóÆÚ¿ª·¢¼Æ»®ÓÐÒÔϼ¸µã£º
1.½ØÍ¼¼¼Êõ·½·¨Ä£¿é»¯³éÀ룬½øÒ»²½ÓÅ»¯µ÷ÓÃÁ´Â·£¬¼Ó¿ìÕûÌå½ØÍ¼»ñÈ¡ËÙ¶È¡£
2.³¤½ØÍ¼¼¼Êõ·½°¸ÓÅ»¯£¬·º»¯Æ´½Ó·½Ïò£¬×é¼þ»¯°ü×°£¬¿Éµ¥¶ÀÁé»î¶ÔÍâÊä³ö¼¼ÊõÄÜÁ¦¡£
3.¶àÆÁ½ØÍ¼³¡¾°ÓÅ»¯£¬µ÷Ñиü¼Ó±ã½ÝÎȶ¨µÄ¶àÆÁ½ØÍ¼·½°¸£¬Âú×ãÔ½À´Ô½¶àµÄ
IoT ³¡¾°¡£
4.½øÒ»²½Íƶ¯Ëã·¨ÄÜÁ¦É£¬Í¨¹ýÂñµãÉϱ¨£¬¼Ó´óËã·¨Êý¾Ý±Õ»·Ö§³Ö¡£
|