Home » Eclipse Projects » SWTBot » Improvement for captureScreenshot
Improvement for captureScreenshot [message #25499] |
Tue, 03 March 2009 11:09  |
Eclipse User |
|
|
|
Hi Ketan,
Thanks so much for SWTBot; I'm using it for a couple of weeks, and it
gives me a lot of satisfaction.
The project I'm working on has a GUI which is changing from day to day,
because it's for research purposes. I have thought SWTbot could also
helped me to maintain up to date the screenshots of the documentation.
Unfortunately, it is not possible to take the screenshoot of a single
shell, or tabfolder. Would it be possible to add a method like this one?
public static boolean captureScreenshot(final String fileName, Widget
widget)
Regards,
Etienne
|
|
|
Re: Improvement for captureScreenshot [message #25537 is a reply to message #25499] |
Tue, 03 March 2009 11:52   |
Eclipse User |
|
|
|
Hi Etienne,
This is very much possible. Take a look at
SWTUtils#captureScreenshotInternal for how the screenshot works. It
works by taking the entire display and dumping the content into an image
object.
What you need instead to do to take the widget instead of the display,
and you should be done.
-- Ketan
On 3/3/09 21:39, Etienne wrote:
> Hi Ketan,
>
> Thanks so much for SWTBot; I'm using it for a couple of weeks, and it
> gives me a lot of satisfaction.
>
> The project I'm working on has a GUI which is changing from day to day,
> because it's for research purposes. I have thought SWTbot could also
> helped me to maintain up to date the screenshots of the documentation.
>
> Unfortunately, it is not possible to take the screenshoot of a single
> shell, or tabfolder. Would it be possible to add a method like this one?
>
> public static boolean captureScreenshot(final String fileName, Widget
> widget)
>
> Regards,
>
> Etienne
>
>
|
|
|
Re: Improvement for captureScreenshot [message #26049 is a reply to message #25537] |
Wed, 04 March 2009 09:32   |
Eclipse User |
|
|
|
Hi,
here is a sample usage of SWTBot to generate the documentation images:
http://model-driven-blogging.blogspot.com/2009/03/shuangxi-e ffect-ui-
testing-and.html
and here is the code to capture the "active shell screenshot"
/**
* This captures a screen shot and saves it to the given file.
*
* @param fileName
* the filename to save screenshot to.
* @return <code>true</code> if the screenshot was created and saved,
* <code>false</code> otherwise.
* @since 1.0
*/
public static boolean captureScreenshot(final String fileName) {
new ImageFormatConverter().imageTypeOf(fileName.substring(fileNa me
.lastIndexOf('.') + 1));
return UIThreadRunnable.syncExec(new BoolResult() {
public Boolean run() {
return captureScreenshotInternal("screenshots/"+fileName,
Display.getDefault()
.getActiveShell());
}
});
}
/**
* Captures a screen shot. Used internally.
* <p>
* NOTE: This method is not thread safe. Clients must ensure that they do
* invoke this from a UI thread.
* </p>
*
* @param fileName
* the filename to save screenshot to.
* @param widget
* @return <code>true</code> if the screenshot was created and saved,
* <code>false</code> otherwise.
* @since 1.1
*/
protected static boolean captureScreenshotInternal(final String fileName,
Shell widget) {
GC gc = new GC(Display.getDefault());
Image image = null;
try {
Rectangle bounds = widget.getBounds();
int width = bounds.width;
int height = bounds.height;
image = new Image(Display.getDefault(), width, height);
gc.copyArea(image, bounds.x, bounds.y);
ImageLoader imageLoader = new ImageLoader();
imageLoader.data = new ImageData[] { image.getImageData() };
imageLoader.save(fileName, new ImageFormatConverter()
.imageTypeOf(fileName
.substring(fileName.lastIndexOf('.') + 1)));
return true;
} catch (Exception e) {
File brokenImage = new File(fileName).getAbsoluteFile();
if (brokenImage.exists()) {
try {
brokenImage.deleteOnExit();
} catch (Exception ex) {
//
}
}
return false;
} finally {
gc.dispose();
if (image != null) {
image.dispose();
}
}
}
cheers,
Cédric
Ketan Padegaonkar wrote:
> Hi Etienne,
>
> This is very much possible. Take a look at
> SWTUtils#captureScreenshotInternal for how the screenshot works. It
> works by taking the entire display and dumping the content into an image
> object.
>
> What you need instead to do to take the widget instead of the display,
> and you should be done.
>
> -- Ketan
>
> On 3/3/09 21:39, Etienne wrote:
>> Hi Ketan,
>>
>> Thanks so much for SWTBot; I'm using it for a couple of weeks, and it
>> gives me a lot of satisfaction.
>>
>> The project I'm working on has a GUI which is changing from day to day,
>> because it's for research purposes. I have thought SWTbot could also
>> helped me to maintain up to date the screenshots of the documentation.
>>
>> Unfortunately, it is not possible to take the screenshoot of a single
>> shell, or tabfolder. Would it be possible to add a method like this one?
>>
>> public static boolean captureScreenshot(final String fileName, Widget
>> widget)
>>
>> Regards,
>>
>> Etienne
>>
>>
|
|
|
Re: Improvement for captureScreenshot [message #26132 is a reply to message #26049] |
Wed, 04 March 2009 11:50   |
Eclipse User |
|
|
|
Thank you very much, Ketan and Cédric,
I have made something which looks like Cédric's code. I have just made
things a bit more generic, with parameter Control instead of Shell.
(my code below)
Etienne
protected static boolean captureScreenshotInternal(final String
fileName, final Control control) {
GC gc = new GC(display());
Image image = null;
try {
//Rectangle bounds = display().getBounds();
//int width = bounds.width;
//int height = bounds.height;
int width = control.getBounds().width;
int height = control.getBounds().height;
Point p = control.toDisplay(0, 0);
image = new Image(display(), width, height);
gc.copyArea(image, p.x, p.y);
(...) // No more modifications after this line.
Cédric Brun a écrit :
> Hi,
>
> here is a sample usage of SWTBot to generate the documentation images:
>
> http://model-driven-blogging.blogspot.com/2009/03/shuangxi-e ffect-ui-
> testing-and.html
>
> and here is the code to capture the "active shell screenshot"
>
> /**
> * This captures a screen shot and saves it to the given file.
> *
> * @param fileName
> * the filename to save screenshot to.
> * @return <code>true</code> if the screenshot was created and saved,
> * <code>false</code> otherwise.
> * @since 1.0
> */
> public static boolean captureScreenshot(final String fileName) {
> new ImageFormatConverter().imageTypeOf(fileName.substring(fileNa me
> .lastIndexOf('.') + 1));
> return UIThreadRunnable.syncExec(new BoolResult() {
> public Boolean run() {
> return captureScreenshotInternal("screenshots/"+fileName,
> Display.getDefault()
> .getActiveShell());
> }
> });
> }
>
> /**
> * Captures a screen shot. Used internally.
> * <p>
> * NOTE: This method is not thread safe. Clients must ensure that they do
> * invoke this from a UI thread.
> * </p>
> *
> * @param fileName
> * the filename to save screenshot to.
> * @param widget
> * @return <code>true</code> if the screenshot was created and saved,
> * <code>false</code> otherwise.
> * @since 1.1
> */
> protected static boolean captureScreenshotInternal(final String fileName,
> Shell widget) {
> GC gc = new GC(Display.getDefault());
> Image image = null;
> try {
> Rectangle bounds = widget.getBounds();
> int width = bounds.width;
> int height = bounds.height;
>
> image = new Image(Display.getDefault(), width, height);
> gc.copyArea(image, bounds.x, bounds.y);
> ImageLoader imageLoader = new ImageLoader();
> imageLoader.data = new ImageData[] { image.getImageData() };
> imageLoader.save(fileName, new ImageFormatConverter()
> .imageTypeOf(fileName
> .substring(fileName.lastIndexOf('.') + 1)));
> return true;
> } catch (Exception e) {
>
> File brokenImage = new File(fileName).getAbsoluteFile();
> if (brokenImage.exists()) {
> try {
>
> brokenImage.deleteOnExit();
> } catch (Exception ex) {
> //
> }
> }
> return false;
> } finally {
> gc.dispose();
> if (image != null) {
> image.dispose();
> }
> }
> }
>
>
> cheers,
>
> Cédric
> Ketan Padegaonkar wrote:
>
>> Hi Etienne,
>>
>> This is very much possible. Take a look at
>> SWTUtils#captureScreenshotInternal for how the screenshot works. It
>> works by taking the entire display and dumping the content into an image
>> object.
>>
>> What you need instead to do to take the widget instead of the display,
>> and you should be done.
>>
>> -- Ketan
>>
>> On 3/3/09 21:39, Etienne wrote:
>>> Hi Ketan,
>>>
>>> Thanks so much for SWTBot; I'm using it for a couple of weeks, and it
>>> gives me a lot of satisfaction.
>>>
>>> The project I'm working on has a GUI which is changing from day to day,
>>> because it's for research purposes. I have thought SWTbot could also
>>> helped me to maintain up to date the screenshots of the documentation.
>>>
>>> Unfortunately, it is not possible to take the screenshoot of a single
>>> shell, or tabfolder. Would it be possible to add a method like this one?
>>>
>>> public static boolean captureScreenshot(final String fileName, Widget
>>> widget)
>>>
>>> Regards,
>>>
>>> Etienne
>>>
>>>
>
>
|
|
|
Re: Improvement for captureScreenshot [message #26174 is a reply to message #26049] |
Wed, 04 March 2009 12:22   |
Eclipse User |
|
|
|
Hi,
Could you attach this to the bugzilla, and I could add this as an API to
SWTBot :)
-- Ketan
On 4/3/09 20:02, Cédric Brun wrote:
> Hi,
>
> here is a sample usage of SWTBot to generate the documentation images:
>
> http://model-driven-blogging.blogspot.com/2009/03/shuangxi-e ffect-ui-
> testing-and.html
>
> and here is the code to capture the "active shell screenshot"
>
> /**
> * This captures a screen shot and saves it to the given file.
> *
> * @param fileName
> * the filename to save screenshot to.
> * @return<code>true</code> if the screenshot was created and saved,
> *<code>false</code> otherwise.
> * @since 1.0
> */
> public static boolean captureScreenshot(final String fileName) {
> new ImageFormatConverter().imageTypeOf(fileName.substring(fileNa me
> .lastIndexOf('.') + 1));
> return UIThreadRunnable.syncExec(new BoolResult() {
> public Boolean run() {
> return captureScreenshotInternal("screenshots/"+fileName,
> Display.getDefault()
> .getActiveShell());
> }
> });
> }
>
> /**
> * Captures a screen shot. Used internally.
> *<p>
> * NOTE: This method is not thread safe. Clients must ensure that they do
> * invoke this from a UI thread.
> *</p>
> *
> * @param fileName
> * the filename to save screenshot to.
> * @param widget
> * @return<code>true</code> if the screenshot was created and saved,
> *<code>false</code> otherwise.
> * @since 1.1
> */
> protected static boolean captureScreenshotInternal(final String fileName,
> Shell widget) {
> GC gc = new GC(Display.getDefault());
> Image image = null;
> try {
> Rectangle bounds = widget.getBounds();
> int width = bounds.width;
> int height = bounds.height;
>
> image = new Image(Display.getDefault(), width, height);
> gc.copyArea(image, bounds.x, bounds.y);
> ImageLoader imageLoader = new ImageLoader();
> imageLoader.data = new ImageData[] { image.getImageData() };
> imageLoader.save(fileName, new ImageFormatConverter()
> .imageTypeOf(fileName
> .substring(fileName.lastIndexOf('.') + 1)));
> return true;
> } catch (Exception e) {
>
> File brokenImage = new File(fileName).getAbsoluteFile();
> if (brokenImage.exists()) {
> try {
>
> brokenImage.deleteOnExit();
> } catch (Exception ex) {
> //
> }
> }
> return false;
> } finally {
> gc.dispose();
> if (image != null) {
> image.dispose();
> }
> }
> }
>
>
> cheers,
>
> Cédric
> Ketan Padegaonkar wrote:
>
>> Hi Etienne,
>>
>> This is very much possible. Take a look at
>> SWTUtils#captureScreenshotInternal for how the screenshot works. It
>> works by taking the entire display and dumping the content into an image
>> object.
>>
>> What you need instead to do to take the widget instead of the display,
>> and you should be done.
>>
>> -- Ketan
>>
>> On 3/3/09 21:39, Etienne wrote:
>>> Hi Ketan,
>>>
>>> Thanks so much for SWTBot; I'm using it for a couple of weeks, and it
>>> gives me a lot of satisfaction.
>>>
>>> The project I'm working on has a GUI which is changing from day to day,
>>> because it's for research purposes. I have thought SWTbot could also
>>> helped me to maintain up to date the screenshots of the documentation.
>>>
>>> Unfortunately, it is not possible to take the screenshoot of a single
>>> shell, or tabfolder. Would it be possible to add a method like this one?
>>>
>>> public static boolean captureScreenshot(final String fileName, Widget
>>> widget)
>>>
>>> Regards,
>>>
>>> Etienne
>>>
>>>
>
>
|
|
|
Re: Improvement for captureScreenshot [message #26257 is a reply to message #26174] |
Thu, 05 March 2009 08:05   |
Eclipse User |
|
|
|
No problem, I'm going to add it to bugzilla.
Etienne
Ketan Padegaonkar a écrit :
> Hi,
>
> Could you attach this to the bugzilla, and I could add this as an API to
> SWTBot :)
>
> -- Ketan
>
> On 4/3/09 20:02, Cédric Brun wrote:
>> Hi,
>>
>> here is a sample usage of SWTBot to generate the documentation images:
>>
>> http://model-driven-blogging.blogspot.com/2009/03/shuangxi-e ffect-ui-
>> testing-and.html
>>
>> and here is the code to capture the "active shell screenshot"
>>
>> /**
>> * This captures a screen shot and saves it to the given file.
>> *
>> * @param fileName
>> * the filename to save screenshot to.
>> * @return<code>true</code> if the screenshot was created and saved,
>> *<code>false</code> otherwise.
>> * @since 1.0
>> */
>> public static boolean captureScreenshot(final String fileName) {
>> new
>> ImageFormatConverter().imageTypeOf(fileName.substring(fileNa me
>> .lastIndexOf('.') + 1));
>> return UIThreadRunnable.syncExec(new BoolResult() {
>> public Boolean run() {
>> return captureScreenshotInternal("screenshots/"+fileName,
>> Display.getDefault()
>> .getActiveShell());
>> }
>> });
>> }
>>
>> /**
>> * Captures a screen shot. Used internally.
>> *<p>
>> * NOTE: This method is not thread safe. Clients must ensure that
>> they do
>> * invoke this from a UI thread.
>> *</p>
>> *
>> * @param fileName
>> * the filename to save screenshot to.
>> * @param widget
>> * @return<code>true</code> if the screenshot was created and saved,
>> *<code>false</code> otherwise.
>> * @since 1.1
>> */
>> protected static boolean captureScreenshotInternal(final String
>> fileName,
>> Shell widget) {
>> GC gc = new GC(Display.getDefault());
>> Image image = null;
>> try {
>> Rectangle bounds = widget.getBounds();
>> int width = bounds.width;
>> int height = bounds.height;
>>
>> image = new Image(Display.getDefault(), width, height);
>> gc.copyArea(image, bounds.x, bounds.y);
>> ImageLoader imageLoader = new ImageLoader();
>> imageLoader.data = new ImageData[] { image.getImageData() };
>> imageLoader.save(fileName, new ImageFormatConverter()
>> .imageTypeOf(fileName
>> .substring(fileName.lastIndexOf('.') + 1)));
>> return true;
>> } catch (Exception e) {
>>
>> File brokenImage = new File(fileName).getAbsoluteFile();
>> if (brokenImage.exists()) {
>> try {
>>
>> brokenImage.deleteOnExit();
>> } catch (Exception ex) {
>> //
>> }
>> }
>> return false;
>> } finally {
>> gc.dispose();
>> if (image != null) {
>> image.dispose();
>> }
>> }
>> }
>>
>>
>> cheers,
>>
>> Cédric
>> Ketan Padegaonkar wrote:
>>
>>> Hi Etienne,
>>>
>>> This is very much possible. Take a look at
>>> SWTUtils#captureScreenshotInternal for how the screenshot works. It
>>> works by taking the entire display and dumping the content into an image
>>> object.
>>>
>>> What you need instead to do to take the widget instead of the display,
>>> and you should be done.
>>>
>>> -- Ketan
>>>
>>> On 3/3/09 21:39, Etienne wrote:
>>>> Hi Ketan,
>>>>
>>>> Thanks so much for SWTBot; I'm using it for a couple of weeks, and it
>>>> gives me a lot of satisfaction.
>>>>
>>>> The project I'm working on has a GUI which is changing from day to day,
>>>> because it's for research purposes. I have thought SWTbot could also
>>>> helped me to maintain up to date the screenshots of the documentation.
>>>>
>>>> Unfortunately, it is not possible to take the screenshoot of a single
>>>> shell, or tabfolder. Would it be possible to add a method like this
>>>> one?
>>>>
>>>> public static boolean captureScreenshot(final String fileName, Widget
>>>> widget)
>>>>
>>>> Regards,
>>>>
>>>> Etienne
>>>>
>>>>
>>
>>
>
|
|
| | |
Re: Improvement for captureScreenshot [message #26984 is a reply to message #26447] |
Tue, 10 March 2009 06:14  |
Eclipse User |
|
|
|
After some other tests, I have found a problem in my implementation.
In method :
public static boolean captureScreenshot(final String fileName, final
Control control)
The line :
Point p = control.toDisplay(0, 0);
Gives good coordinates for widgets *except* for shells which have a border.
In this special case, the toDisplay method returns the first point on
the top left corner inside the borders of the wigets, whereas we would
like to get the point on the top left corner of the System title bar of
the window.
I think we could change the line :
Point p = control.toDisplay(0, 0);
into :
if (control.getClass() == Shell.class)
p = control.getLocation();
else
p = control.toDisplay(0, 0);
I'm not expert enough in SWT to say if it's the best way to get correct
screenshot areas...
Etienne
--> https://bugs.eclipse.org/bugs/show_bug.cgi?id=267189
Ketan Padegaonkar a écrit :
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=267189
>
> Fixed and committed to trunk, as some added goodness, you can now
> capture just about any rectangular region on the screen.
>
> -- Ketan
>
> On 5/3/09 20:43, Chris Aniszczyk wrote:
>> Etienne wrote:
>>> No problem, I'm going to add it to bugzilla.
>>
>> Do you have a bug number?
>>
>> Cheers,
>>
>> Chris Aniszczyk | EclipseSource Austin | +1 860 839 2465
>> http://twitter.com/eclipsesource | http://twitter.com/caniszczyk
>
|
|
|
Goto Forum:
Current Time: Fri Apr 18 21:55:24 EDT 2025
Powered by FUDForum. Page generated in 0.03848 seconds
|