23rd August 2008

New Flash 10 Class: SavingBitmap

posted in ActionScript, Flash |

I've been creating a lot of AS3 generated graphics over at Art From Code and have faced the problem of how to get the generated bitmaps (or vectors) out to files. For a lot of the files, they are quick experiments and I do a quick screenshot with Jing. For others, I've created AIR apps that let you save out files to the file system. But it dawned on me the other day, that in Flash 10, the FileReference class has a save method.

By following the instructions here, I got Flex builder set up to compile Flash 10 movies. By including the framework swc in my project I get access to the JPEGEncoder and PNGEncoder classes. These take a BitmapData and return a ByteArray. You can then pass that ByteArray to FileReference.save() to save the encoded JPG / PNG to local disk, even from a plain old SWF.

I figure I'll be using this functionality a lot to save BitmapDatas, so I created a new class called SavingBitmap which allows you to save the with a single method call. Here's the class:

Actionscript:
  1. package com.bit101
  2. {
  3.     import flash.display.Bitmap;
  4.     import flash.display.BitmapData;
  5.     import flash.net.FileReference;
  6.     import flash.utils.ByteArray;
  7.    
  8.     import mx.graphics.codec.IImageEncoder;
  9.     import mx.graphics.codec.JPEGEncoder;
  10.     import mx.graphics.codec.PNGEncoder;
  11.  
  12.     public class SavingBitmap extends Bitmap
  13.     {
  14.         private var _fileRef:FileReference;
  15.         private var _encoder:IImageEncoder;
  16.         private var _jpegQuality:Number = 80;
  17.         private var _encoderType:String = JPEG;
  18.        
  19.         public static const JPEG:String = "jpeg";
  20.         public static const PNG:String = "png";
  21.        
  22.        
  23.         public function SavingBitmap(bitmapData:BitmapData=null, pixelSnapping:String="auto", smoothing:Boolean=false)
  24.         {
  25.             super(bitmapData, pixelSnapping, smoothing);
  26.             _fileRef = new FileReference();
  27.             _encoder = new JPEGEncoder(_jpegQuality);
  28.         }
  29.        
  30.         public function set jpegQuality(value:Number):void
  31.         {
  32.             _jpegQuality = value;
  33.             if(_encoder is JPEGEncoder)
  34.             {
  35.                 _encoder = new JPEGEncoder(_jpegQuality);
  36.             }
  37.         }
  38.         public function get jpegQuality():Number
  39.         {
  40.             return _jpegQuality;
  41.         }
  42.        
  43.         public function set encoderType(value:String):void
  44.         {
  45.             _encoderType = value;
  46.             if(_encoderType == JPEG)
  47.             {
  48.                 _encoder = new JPEGEncoder(_jpegQuality);
  49.             }
  50.             else
  51.             {
  52.                 _encoder = new PNGEncoder();
  53.             }
  54.         }
  55.         public function get encoderType():String
  56.         {
  57.             return _encoderType;
  58.         }
  59.        
  60.         public function save(defaultFileName:String = null):void
  61.         {
  62.             var ba:ByteArray = _encoder.encode(bitmapData);
  63.             _fileRef.save(ba, defaultFileName);
  64.             ba.clear();
  65.         }
  66.     }
  67. }

As you can see, the class extends Bitmap, so you can use it just like any other Bitmap. You create a usual BitmapData and instead of wrapping it in a Bitmap, you wrap it in a SavingBitmap. When you are ready to save it, you just call the SavingBitmap's save() method. This encodes the BitmapData to either a PNG or JPG and sends it to the FileReference.save method. A dialog will open up for the user to select a place to save the file and it will be saved. There are other methods to choose what encoder to use and the JPG quality.

Here's an example of it in use. A really rough example, but it shows that it works. In case you weren't following along, Flash 10 player is required:

Draw on the white canvas then click save to save it. Open the saved file to see that it is what you drew. Here's the code that went into making that:

Actionscript:
  1. package
  2. {
  3.     import com.bit101.SavingBitmap;
  4.    
  5.     import flash.display.BitmapData;
  6.     import flash.display.Sprite;
  7.     import flash.display.StageAlign;
  8.     import flash.display.StageScaleMode;
  9.     import flash.events.Event;
  10.     import flash.events.MouseEvent;
  11.     import flash.text.TextField;
  12.     import flash.text.TextFieldAutoSize;
  13.  
  14.     public class Saving2 extends Sprite
  15.     {
  16.         private var _bmp:SavingBitmap;
  17.         private var _color:uint;
  18.         private var _bmpd:BitmapData;
  19.        
  20.         public function Saving2()
  21.         {
  22.             stage.align = StageAlign.TOP_LEFT;
  23.             stage.scaleMode = StageScaleMode.NO_SCALE;
  24.            
  25.             _bmpd = new BitmapData(600, 600, false, 0xffffff);
  26.             _bmp = new SavingBitmap(_bmpd);
  27.             _bmp.x = 10;
  28.             _bmp.y = 10;
  29.             addChild(_bmp);
  30.            
  31.             stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  32.            
  33.             var saveBtn:TextField = new TextField();
  34.             saveBtn.text = "Save";
  35.             saveBtn.selectable = false;
  36.             saveBtn.background = true;
  37.             saveBtn.border = true;
  38.             saveBtn.autoSize = TextFieldAutoSize.LEFT;
  39.             saveBtn.height = saveBtn.textHeight;
  40.             addChild(saveBtn);
  41.             saveBtn.x = 280;
  42.             saveBtn.y = 620;
  43.             saveBtn.addEventListener(MouseEvent.CLICK, onClick);
  44.         }
  45.        
  46.         private function onClick(event:MouseEvent):void
  47.         {
  48.             _bmp.save("drawing.jpg");
  49.         }
  50.        
  51.         private function onMouseDown(event:MouseEvent):void
  52.         {
  53.             _color = Math.random() * 0xffffff;
  54.             addEventListener(Event.ENTER_FRAME, onEnterFrame);
  55.             stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  56.         }
  57.        
  58.         private function onEnterFrame(event:Event):void
  59.         {
  60.             for(var i:int = 0; i <100; i++)
  61.             {
  62.                 _bmpd.setPixel(_bmp.mouseX + Math.random() * 50 - 25, _bmp.mouseY + Math.random() * 50 - 25, _color);
  63.             }
  64.         }
  65.        
  66.         private function onMouseUp(event:MouseEvent):void
  67.         {
  68.             removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  69.             stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  70.         }
  71.     }
  72. }

The whole saving functionality is encapsulated in this one method that gets called when you click the save button:

Actionscript:
  1. private function onClick(event:MouseEvent):void
  2. {
  3.     _bmp.save("drawing.jpg");
  4. }

Pretty damn easy. One caveat is that the saving MUST happen on a button click / mouse event. Otherwise you'll get a security error.

Another caveat is that the Flash 10 compiling in Flex Builder is pretty rough still. It isn't the easiest thing to get set up, and as of this writing, a LOT of the code hinting is missing. Specifically, you won't get code hinting for BitmapData and you'll have to add the import statement manually. This happens for some other stuff as well. This had me convinced that it wasn't working at all, but once you add the imports and write the code, FB recognizes it as correct and it compiles just fine.

One final caveat is that once you call save, there is a lag while the encoding happens. You might want to try to sneak in some kind of user message there, that the encoding is happening. This might be a bit rough though because anything you try to display won't show up until the method completes. And if you try to delay the encoding, then the FileReference.save method won't be being called directly from the mouse click and will fail... So, you might want to amend the class to separate the encoding and the saving. But the above is all I need for my own purposes of personal use. Thought I'd share it.

Post to Twitter

This entry was posted on Saturday, August 23rd, 2008 at 9:53 pm and is filed under ActionScript, Flash. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

There are currently 34 responses to “New Flash 10 Class: SavingBitmap”

  1. 1 On August 24th, 2008, Sep said:

    I was wondering if you knew a way to “output/convert or save” the generated art swf to an editable format such as e.i. an illustrator file, so that you can edit it manually… I know that Joshua Davis had a way of doing it in flash 5.

  2. 2 On August 24th, 2008, Ash said:

    Thanks for reminding me about your sub-blog. Why not have a list of posts on this blog, so I won’t forget to go look? :)

  3. 3 On August 24th, 2008, Matthias said:

    Sorry for being nitpick, but wouldn’t “BitmapSave” be a better class name?

  4. 4 On August 24th, 2008, kp said:

    Matthias. Well it IS a Bitmap and it has the ability to save itself, so I was going to make it SaveableBitmap or SavableBitmap, but I wasn’t sure which was the correct way to spell it and knew I’d struggle with it every time I used it. :) So it became SavingBitmap.

    Sep, yeah, Josh used to print to PDF, which outputs as vector so it could be scaled up and edited etc. Not sure if that still works, but I’d think it should. The problem I have with that is often I’m putting thousands of particles or shapes down. Thousands of thousands. And Flash starts puking on that many vectors, so I draw to a large bitmap to keep the performance up. It’s not editable as a vector, but you can make it large enough that it still looks good at most sizes. And you can use tricks like my BigAssBitmap class or loading in a bigger empty bitmap to get bitmap sizes even larger than 2880×2880. Actually, in Flash 10, you can already make bigger bitmaps. I just remembered that. I’ll have to try it now!

  5. 5 On August 24th, 2008, Sep said:

    Thanks, for that but i am really interested in getting an editable version as vector of my generated art swf, and after 2 and a half hours searching i haven t found any solution to that problem… all i am getting is a “Bipmap pdf” so far :(

  6. 6 On August 24th, 2008, kp said:

    Sep, if you are on a Mac, you can right click a swf, select print, and from the print dialog, save as pdf or save as postscript. If your swf contains vectors, those should be saved out as vectors. If you’re not on a mac, you should still be able to get some kind of pdf printer driver that should do the same thing.

  7. 7 On August 24th, 2008, kp said:

    Actually, I just tried it, and it seems the save to pdf / postscript converts vectors to bitmaps. I think that may have been different when Josh was doing it, or maybe he was doing it some other way. not sure.

  8. 8 On August 25th, 2008, RV said:

    Steps to save Flash vector art:

    1. Add a PS printer to Windows (for example ‘Apple Color LW 12/660 PS’).
    2. For the printer port choose FILE:(print to file).

    3. Right-click on the Flash content and select ‘Print’.

    Now when you print using the printer you just added it writes an .eps file to your desktop.

  9. 9 On August 25th, 2008, Strid said:

    Nice, but where was the file saved to?

    should a dialog box open? it didn’t for me :(

  10. 10 On August 25th, 2008, kp said:

    Strid, yes, if you have Flash 10 a save dialog should open up

  11. 11 On August 26th, 2008, Sep said:

    I am on a Mac pro with leopard, i tried to download the adobeps drivers, but they wont work ” because the Classical environment is no longer supported”. So i moved to windows via bootcamp and got a eps generated with perfect vectors but in shades of grey. I will look at other drivers when i have the time, hopefully this will fix the color issue :)

    Does anyone knows how to get this to work on a mac ? and what driver to use to keep the colors ?

    Thanks guys

  12. 12 On August 26th, 2008, Sep said:

    I forgot to mention that i lost the alpha as well in the conversion to eps. Don’t know if this is normal or not :( ???

  13. 13 On August 26th, 2008, Berger said:

    I took in a Josh Davis presentation where he talked about how he did his exporting (he was saving an EPS).

    We had to go back to Flash Player 8 for the print funciton to work, and that feature was disabled for Flash Player 9.

  14. 14 On August 27th, 2008, Sep said:

    I have managed to convert my “flash player 9 AS3 coded” swf to an eps following RV’s comments. I am getting perfectly formed vectors, the problem is the alpha and the colors…

  15. 15 On August 27th, 2008, Sep said:

    I have tried Apple Color LW 12/660 PS, and now i have got colors ;) but the alpha is still not working, and this solution is only working on windows for the moment, I will try with other drivers to see if I can get the alpha working…

  16. 16 On August 27th, 2008, Norm Soule said:

    Really cool stuff. Recently I have been thinking of making an AIR app that would do this for a scripted animation. I think that it would be useful for wild effects that take too long to render.

  17. 17 On August 27th, 2008, kp said:

    Norm, I’m going down exactly the same lines. Too bad AIR 1.0 doesn’t support Flash 10 yet.

  18. 18 On August 28th, 2008, Cay said:

    About saving vectors, the PDF Printer works pretty smooth in Windows… for some reason it doesn’t in Mac. But in exchange, there is a great trick for exporting complex compositions ever since AS3.
    You see, when we do such things, we usually lose the vectors at the end of each frame, after drawing them into a BitmapData… well, if instead of clearing them, you store them in an off-stage sprite, they will stay there, not rendering, thus not using the CPU (just some memory). You can later use printJob to send that sprite to the printer (Distiller for example) and get a full vector PDF in no time and without even rendering the vectors for the output… I’ve been able to export literally millions of vectors at once without crashing or even stalling the Flash Player (Distiller does takes some time creating the PDF, but FP doesn’t seem to suffer much :) ).
    You do lose alphas and colors, but I think I remember that nesting sprites for each lineStyle solved this issue.
    Of course, there is always AlivePDF, or straight PostScript string creation for more elaborated things ;)

    Cheers :)

  19. 19 On August 28th, 2008, Min Thu said:

    This is very good example of image processing in Flash! No need server-side for image processing.

  20. 20 On August 28th, 2008, yifa said:

    very very cool!

  21. 21 On August 28th, 2008, Nick Johnston said:

    Nice work Keith!

    One thing I noticed was the inability to overwrite existing images on a Mac. I tested in Firefox 2, Firefox 3, Safari 3.1.2 on Mac. I was able to overwrite an image just fine on Windows (tested on Firefox 2, and IE). It appears to be a Flash Player 10 bug on Mac.

  22. 22 On August 30th, 2008, Mark Knol said:

    Hi bit101,

    Love your work! I wrote a simulair class (FlashPlayer 9 in combination with PHP) for saving as images (JPG / PNG using adobe’s encoders). I see your class extends the Bitmap class, but mine doesn’t extend anything, because it can save all types of displayobjects. Sometimes you just want to save a displayobject (movieclip, sprite, textfield, shape) directly, instead of drawing it into an bitmapdata object. Maybe you could take a look at it?

    http://blog.stroep.nl/2008/08/as3-imagesaver-class-v10/

  23. 23 On August 30th, 2008, kp said:

    That’s cool Mark. I imagine it must be creating a bitmapdata behind the scenes and drawing to it in order to encode, right? But it’s cool that it saves you that step if you just want to save a non-bitmap. You should look at implementing the local save in Flash 10 with that.

  24. 24 On August 31st, 2008, Mark Knol said:

    Thanks. Yes, you are right, internal it created a bitmapdata (with the right bounds) and encodes the data. Saving as local file would be a great feature, it’s a pity saving to local isn’t supported in FP9 like FP10 does.

  25. 25 On September 2nd, 2008, Olivier said:

    Hey did you people know this is possible with flash player 9? i once scripted flash too save webcam pics to a local server (other pc) in a clothes-store, there was a little server end php involved though, wich i see isnt beeing used here

  26. 26 On September 10th, 2008, Burrows said:

    great,it can also be available in air

  27. 27 On September 21st, 2008, T-Shirt Girl said:

    yeah great but what do you do with such big pictures? I don’t really get it…

  28. 28 On September 21st, 2008, kp said:

    If you want to make prints of images generated in Flash, you get much better results with high resolution images. A high quality print would be up to 300 dpi. So to make a 24×24 inch print, you would need a 7200×7200 pixel bitmap. I’ve been printing 24 inch prints at 4000 pixels, which is about 167 dpi and it’s still pretty decent. 150 dpi is about as low as you would want to go.

  29. 29 On December 1st, 2008, polyGeek said:

    That’s very nice indeedy. You know, you’re getting pretty good at this code stuff. Maybe you should write a book or something. Just a thought. :)

  30. 30 On December 6th, 2008, daniel said:

    Hi!
    Great post, it’s just what i was looking for. Works sweet, after installing f10 :D
    However I can’t reproduce it of my flex builder (I must say i’m a newbie in flash/flex). How can I lauch the app. on fb3?
    thanks in advance,

    d

  31. 31 On December 16th, 2008, Bookmarks about Mouse said:

    [...] – bookmarked by 6 members originally found by wineypooh on 2008-11-06 New Flash 10 Class: SavingBitmap http://www.bit-101.com/blog/?p=1415 – bookmarked by 6 members originally found by HeartIessNobody [...]

  32. 32 On April 4th, 2009, chris said:

    One question.When you click save , the “default.jpg” file appears. But there are users that will write instead only “mypicture” for example and will forget the file extension. Is there a workaround for this? I mean, how can I add by default the extension right BEFORE saving ?

    Thanks

  33. 33 On July 13th, 2009, Ian Appleby said:

    chris – that’s a flash player bug
    see: http://bugs.adobe.com/jira/browse/FP-2014

  34. 34 On July 20th, 2009, danno~ said:

    i really wish that everything wouldn’t completely hang while the encoding is done. when working with something that is 2000×2000 pixels, it hangs for quite a few seconds, not allowing you to do anything else in the browser until it is done.

    any recommendations about how to tackle that?

    rocksteady,
    danno~

Leave a Reply

Who is reading BIT-101?

Copyright ©2009 by Keith Peters. All rights reserved. This means that you may not reprint or repost the contents of this site without express written permission of the author.


  • Calendar

  • February 2010
    M T W T F S S
    « Jan    
    1234567
    891011121314
    15161718192021
    22232425262728
hoodia order buy Levitra Plus betablockers weight loss information buy pills without a prescription arthritis menopause ambien doses cat's eye health information on cholesterol cialis online order valtrex cheapest phentermine onlin e increase breast size lower blood sugar immediately terramycin which is better cialis or viagra buy cheap cialis reduce cholesterol naturally new blood pressure treatment products for back pain cheapest cialis index will levitra help piroxicam 20 mg order viagra online in germany buy tadalafil online buy levitra onlines how to naturally lower cholesterol buy generic viagra where to buy soma anti allergic drug levothyroxine dogs new hair loss treatmen buy levitra pain meds buy cheap malaria therapy weight loss after baby asthma medications chronic snoring viagra gel prostate cancer cures order viagra cialis alprazolam men health natural cure arthritis immune system support diet medicine cialis approval lipitor effects where can i buy arthritis drugs overactive bladder in men self help weight loss natural cholesterol control ativan medication cialis approval best cure for snoring breast enhancing pills order prozac celebrex pharmacy buy levitra onlines premature ejaculation cure confidence hypnotherapy free stop smoking bust enhance diet weight loss supplements skin fungal infection valium with no prescription viagra with out prescription breast enhancement products alpha blocker medications azithromycin 250mg skin disease chronic heart failure medicines dog care products buying cialis online gerd in children antibiotics to buy my drug store muscle building diet drugs affecting levitra anti anxiety medications really large breast enhancement help for constipation ulcers stomach drugs for high blood pressure selling pet products buy pain medicine viagra online overnight fucidin ointment generic zyrtec prices soft tab cialis smoking treatment dog products online weight loss solution cialis on line blue pills weight loss diet pill nitroglycerin sublingual floxin prevention of heart attack imuran order gasex vermox treatment of depression Viagra On Line buy generic cialis professional tooth whitening kits to buy valium 2mg treatment for hypertension ultram cheapest online stores hair loss products cheap weight loss diovan prescription malaria preventative taurine treating prostate cancer immune system support natural constipation cure phentermine no prescription fast delivery purchase meds without prescription buy plendil diet drug taking viagra after cialis protonix cheapest generic cialis online viagra levitra cialis yohimbe benefits muscle mass gain diet and health products medical treatment for insomnia buy blood pressure meds buy celexa levaquin interactions blood pressure drug skin disorder where can i buy arthritis drugs natural breast enhancer acute pain control online diazepam natural acne remedy antifungal strategies triphala pravachol online how can i stop smoking breast enhancement natural nautral breast enhancement beta blocker medications wellbutrin dosages order viagra cialis lower high blood pressure mass muscle phentermine from canada how to loss weight osteoporosis bone health lipitor use dog medication drug allergies buy diazepam buyviagra cialis phentermine 37.5 mg zestril medication parkinsons treatment generic revatio free nexium cosmetic dentistry tooth whitening avalide generic buy cheap tadalafil uk simvastatin tablets buy cialis online in usa breast pain cat care ovulating clomid medical skin care lines viagra to canada viagra or cialis cheap cialis tramadole buy azulfidine drugs used for cancer ear pain oral ketoconazole raloxifene evista taurine sex with levitra stop smoking today heart failure natural cholesterol control protonix dose oxybutynin 5mg irritable bowel syndrome treatments new treatment for hepatitis c cheap prescription drugs viagra online prescription depression therapy buy sumycin menopause treatment hair loss treatments medication pletal what is a natural antibiotic viagra purchase synthroid tablets generic prilosec lipitor cat health info discount vitamin cholesterol and health bacterial diarrhea weight loss medicine new treatment for depression removing retention fluids diuretic medicines soma 250mg cat anxiety loss weight online pharmacy viagra buy phentermine without a prescription herbs for breast growth cymbalta dosage fast weight loss supplement arthritis menopause levitra online order cheapest place to buy phentermine cold flu medications for nausea buy ultram where pills for acne free weight loss programs help with anxiety improve skin valium 2mg urinary tract health cat urinary tract disease crestor dosage drug zofran calan zyrtec buy nirdosh dosage digoxin buy pain patch acomplia alendronate cialis best price cheap wellbutrin small dog products depression medicine sildenafil dosage dog health depression and anxiety lamictal withdrawal viagra, levitra and cialis online drug buy bone maker strontium cures for hair loss nitroglycerin tablets natural arthritis treatment arimidex buy buy energy patch how to treat a yeast infection viagra herb alternative viagra cialis levitra order sublingual cialis cialis comparison breast lift augmentation seroquel for depression carisoprodol mg new treatment for depression cialis soft tabs safe sleep aid severe leg muscle pain natural weight loss gabapentin medication what is ambien clozapine medication viagra online ordering cures for hair loss free weight loss help buy viagra levitra pet treats order plan b diabetes type 2 phentermine risk ultram er side effects treatment for hepatitis b constipation cures drugs used in treating depression leg pain buy cheap generic cialis anti anxiety meds hypnotherapy for weight loss motilium body building fitness dog skin relieve upper back pain cures for high blood pressure cardura celecoxib Viagra Online Cheap cheap bactrim ambien online lamisil cost infertility meds progesterone clomid osteoporosis hormon urinary tract infection symptoms hypnotherapy for health how to buy viagra online joint pain cure online allegra buy generic cialis uk generic abilify cures for lung cancer new treatments for lung diseases pain meds buy cheap treatment for dry skin disease of the skin nexium drug free stop smoking buy tooth whitening products viagra tablet naprosyn dosage women's fertility male sexual power carisoprodol purchase asthma attack treatment estradiol pills phentermine from canada pet health care hair loss products online astelin generic cheap estrace free weight loss program buy rimonabant relieve lower back pain lexapro prescription new breast cancer drug buying ambien best online viagra scams home scabies treatment hair loss in woman buy generic cialis uk eye drop gabapentin medication amitriptyline uses ultram no prescription natural pain cures buy cla products back pain lowest price generic viagra pain meds buy cheap mg buy phentermine acne skin care cialis rx weight loss and fitness nitrofurantoin buy phentermine without a prescription high blood pressure medicines stop hair loss viagra china use levitra female health coreg dosage carisoprodol price pain relief product breast enlargement depression pills buy how to treat flu home neck pain relief order imitrex online vitamin b-6 cialis soft tabs pharmacy software description of soma buy isoniazid cheap prevacid help ear infections on dog fat burning stop smoking remedies rhinitis treatment chronic pain relief birth control online meds without prescriptions buy lovastatin drug stores penis enlargement without pill cancer medicine buy deltasone cure for throat infection thyroid dogs dosage cipro viagra from uk cheap alcoholism treatment natural cure for constipation paxil cialis 5mg tablets amitriptyline uses topamax drugs lower heart rate drug discount codes dog medicines body fat loss joint pain recurring urinary tract infections ativan information buy drugs online cheap fast valium body building ambien maximum dosage information on valium how to sperm more chlamydia medication dosage buy cialis online viagra chest pain heart fluconazole interaction calcium channel blocker side effects zolpidem dosage online drug stores zelnorm muscle strength fluconazole buy stress gum free weight loss products information on gout low immune system online viagra cialis 20 buy cefixime phentermine from canada gain muscle mass fast lasix side effects buy singulair penis enlargement free natural muscle and joint health viagra online overnight cialis online aceon allergies and asthma diamox side effects weight loss software generic compazine price for tramadol high blood pressure symtoms osteoporosis help treatment severe constipation drug new smoking stop pain relief product xanax online dog health info clonazepam .5mg buy tribulus pregnancy prevention methods allergy hives