BlackBerry Forums Support Community

BlackBerry Forums Support Community (http://www.blackberryforums.com/)
-   Developer Forum (http://www.blackberryforums.com/developer-forum/)
-   -   zoom in the text on the image (http://www.blackberryforums.com/developer-forum/95637-zoom-text-image.html)

streamh 09-18-2007 05:19 AM

zoom in the text on the image
 
Hi,everyone:

I'm research on how to zoom in the texts or lines which drawing on the image, and I want to know how to implement it .
Code:

public void OpenFile()
    {
       
        try {
            FileConnection fconn = (FileConnection)Connector.open("file:///SDCard/BlackBerry/pictures/ddd78e99bb07e70d6e068c9b.jpg");
            // If no exception is thrown, then the URI is valid, but the file may or may not exist.
            if (fconn.exists())
            {
                InputStream input = fconn.openInputStream();
                int available = (int)fconn.fileSize();
                byte[] data = new byte[available];
                input.read(data, 0, available);
                EncodedImage image = EncodedImage.createEncodedImage(data,0,data.length);
                image.setScale(2); //zoom out the image to 50%   
                Bitmap b = image.getBitmap(); 
                Graphics myGraphics = new Graphics(b);//draw a text!
                myGraphics.setColor(0xFF0000);               
                myGraphics.drawText("myText", 20, 5);
                BitmapField picture = new BitmapField(b);   
                //show the picture
            }
            else           
            {               
                System.out.println("Picture does not exist");
            }
            fconn.close();           
        }
        catch (Exception ioe)
        {
            System.out.println("Error");
        }
  }

As well know to all , we can zoom in or out the image by image.setScale(). I draw a text on the Bitmap got by the image.getBitmap() , but the when the image is zoomed in or out , the text is not changed , so how could I implement this?
In my opinion, I should change the bitmap b into EncodedImage after I draw the text on it. So I can call the method setScale() to zoom in or out the text with the origin image. But how can I change the bitmap b into EncodedImage?
Does anyone have any suggestions?
Thank you very much!!

Pook 09-18-2007 12:06 PM

This is not very robust code (Bitmap dimensions must be even) and I got the Alpha wrong but it sort of does the job.

Code:

    public static Bitmap getHalfScale( Bitmap bitmap )
    {
        int height, width, red, green, blue, alpha;
        int[] pixelInput;
        int[] pixelOutput;
       
        width = bitmap.getWidth();
        height = bitmap.getHeight();

        Bitmap result = new Bitmap( bitmap.getType(), width / 2, height /2 );
       
        pixelInput = new int[width * height];
        pixelOutput = new int[result.getWidth() * result.getHeight()];
       
        bitmap.getARGB( pixelInput, 0, width, 0, 0, width, height );
       
        for ( int x = 0; x < width; x += 2 )
        for ( int y = 0; y < height; y += 2 )
        {
            alpha = 0;
            red = 0;
            green = 0;
            blue = 0;
           
            for ( int dx = 0; dx < 2; dx++ )
            for ( int dy = 0; dy < 2; dy++ )
            {
                alpha += ( pixelInput[indexFromCoordinates(x+dx,y+dy,width)] & 0xff000000 ) >> 24;
                red += ( pixelInput[indexFromCoordinates(x+dx,y+dy,width)] & 0x00ff0000 ) >> 16;
                green += ( pixelInput[indexFromCoordinates(x+dx,y+dy,width)] & 0x0000ff00 ) >> 8;
                blue += ( pixelInput[indexFromCoordinates(x+dx,y+dy,width)] & 0x000000ff );
            }

            alpha >>= 2;
            red >>= 2;
            green >>= 2;
            blue >>= 2;
            pixelOutput[indexFromCoordinates(x/2,y/2,result.getWidth())] = 0x70000000 | ( red << 16 ) | ( green << 8 ) | blue;
        }
       
        result.setARGB( pixelOutput, 0, result.getWidth(), 0, 0, result.getWidth(), result.getHeight() );

        return result;
    }
   
    public static int indexFromCoordinates( int x, int y, int width )
    {
        int result;
        result = y * width + x;
        return result;
    }


streamh 09-19-2007 02:05 AM

Thank you , pook! I'm pleasure to see your post!
Firstly, for the function getHalfScale , we can only zoom out the bitmap by many pixel operations. I think it may be adding too much compute process comparing with setScale(), of course it's maybe!
Secondly, if we want to zoom in the image, we need to write another image processing algorithm. And obviously , the algorithm of getting the average value of a n*n area is not the best way.

So I think using the system method setScale() maybe is a better way! And I want to change the bitmap b into EncodeImage , how can I do this?

Thank you again for your help!

streamh 09-19-2007 02:09 AM

And there are some bugs on your code!
"x+dx" and "y+dy" maybe bigger than width and height !
And you should make a judgement on whether there is an alpha map associated with this Bitmap by calling hasAlpha() .


All times are GMT -5. The time now is 03:28 AM.

Powered by vBulletin® Version 3.6.12
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.