如何在黑莓中裁剪特定形状的图像?

2024-03-13

大家好,感谢阅读我的回答希望你能帮助我

我正在黑莓手机上进行图像裁剪。在我的应用程序中包含 3 个主要内容。

1)将图像加载到屏幕上

2)选择裁剪区域的形状

3)在下一个屏幕上显示裁剪图像而不丢失其形状

第1步:我可以完成图像加载部分

步骤2:使用菜单我只添加4种类型的形状

       1)Circle

        2)Rectangle with rounded shape

       3)Star 

       4)Cloud 

使用菜单,当他单击任何菜单项时,特定形状的图像将显示在屏幕上。

我们可以给该图像赋予运动,因为我们必须让他选择图像的任何部分。

步骤3:固定位置后,我们将允许用户使用菜单进行裁剪。 当他点击菜单项“CROP”时。然后我们必须根据形状裁剪图像,并且该图像应该显示在下一个屏幕上

注意:以下代码仅适用于矩形形状,但我想 使用所有形状

这是我的示例代码::

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.Screen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.XYEdges;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.container.VerticalFieldManager;
import net.rim.device.api.ui.decor.BackgroundFactory;

public class ClipMove extends MainScreen{
    Bitmap circle_frame,rectangle_frame,star_frame,cloud_frame,image,selected_frame;
    BitmapField frmae_field;
    private int padding_x=0,padding_y=0;
    private VerticalFieldManager vrt_mgr;
    public ClipMove() {
        //Here my shape images are transparent  
        circle_frame=Bitmap.getBitmapResource("circle.gif");
        rectangle_frame=Bitmap.getBitmapResource("rect1.png");
        star_frame=Bitmap.getBitmapResource("star.gif");
        cloud_frame=Bitmap.getBitmapResource("cloud.gif");

        //this is my actual image to crop
        image=Bitmap.getBitmapResource("sample.jpg"); 

        vrt_mgr=new VerticalFieldManager(){
            protected void sublayout(int maxWidth, int maxHeight) {
                super.sublayout(Display.getWidth(),Display.getHeight());
                setExtent(Display.getWidth(),Display.getHeight());
            }

        };
        vrt_mgr.setBackground(BackgroundFactory.createBitmapBackground(image));


        add(vrt_mgr);
    }

    protected void makeMenu(Menu menu, int instance) {
        super.makeMenu(menu, instance);
        menu.add(new MenuItem("Rect",0,0) {
            public void run() {
                // TODO Auto-generated method stub
                vrt_mgr.deleteAll();
                selected_frame=rectangle_frame;
                frmae_field=new BitmapField(rectangle_frame);
                vrt_mgr.add(frmae_field);
                vrt_mgr.invalidate();

            }
        });

        menu.add(new MenuItem("Circle",0,0) {
            public void run() {
                // TODO Auto-generated method stub
                vrt_mgr.deleteAll();
                selected_frame=circle_frame;
                frmae_field=new BitmapField(circle_frame);
                vrt_mgr.add(frmae_field);
                vrt_mgr.invalidate();

            }
        });

        menu.add(new MenuItem("Star",0,0) {
            public void run() {
                // TODO Auto-generated method stub
                vrt_mgr.deleteAll();
                selected_frame=star_frame;
                frmae_field=new BitmapField(star_frame);
                vrt_mgr.add(frmae_field);
                vrt_mgr.invalidate();
            }
        });

        menu.add(new MenuItem("Cloud",0,0) {
            public void run() {
                // TODO Auto-generated method stub
                vrt_mgr.deleteAll();
                selected_frame=cloud_frame;
                frmae_field=new BitmapField(cloud_frame);
                vrt_mgr.add(frmae_field);
                vrt_mgr.invalidate();
            }
        });
        menu.add(new MenuItem("Crop",0,0) {
            public void run() {
                // TODO Auto-generated method stub
                Field f=vrt_mgr.getField(0);
//              XYRect rect=getFieldExtent(f);
                XYRect rect=new XYRect(padding_x, padding_y,frmae_field.getBitmapWidth(),frmae_field.getBitmapHeight());
                 Bitmap crop = cropImage(image, rect.x, rect.y,
                            rect.width, rect.height);
                 synchronized (UiApplication.getEventLock()) {
                    UiApplication.getUiApplication().pushScreen(new sampleScreen(crop,selected_frame));
                }

            }
        });

    }
    protected boolean navigationMovement(int dx, int dy, int status, int time) {
        if(frmae_field!=null){
            padding_x=padding_x+dx;
            padding_y=padding_y+dy;
            XYEdges edge=new XYEdges(padding_y, 0, 0, padding_x);
            frmae_field.setPadding(edge);
            vrt_mgr.invalidate();
            return true;
        }else {
            return false;
        }

    }

     public void DisplayMessage(final String str)
     {
         UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.inform(str);
            }
        });
     }
     public XYRect getFieldExtent(Field fld) {
            int cy = fld.getContentTop();
            int cx = fld.getContentLeft();
            Manager m = fld.getManager();
            while (m != null) {
                cy += m.getContentTop() - m.getVerticalScroll();
                cx += m.getContentLeft() - m.getHorizontalScroll();
                if (m instanceof Screen)
                    break;
                m = m.getManager();
            }
            return new XYRect(cx, cy, fld.getContentWidth(), fld.getContentHeight());
       }
     // this logic only useful for rectangler shape 
     public  Bitmap cropImage(Bitmap image, int x, int y, int width,int height) {
            Bitmap result = new Bitmap(width, height);
            Graphics g = Graphics.create(result);
            g.drawBitmap(0, 0, width, height, image, x, y);
            return result;
     }
}
//this is my next screen to show the croped image 
class sampleScreen extends MainScreen
{
    VerticalFieldManager manager;
    public sampleScreen(final Bitmap img,final Bitmap back) {
        manager=new VerticalFieldManager(){
            protected void paint(Graphics graphics) {
                graphics.drawBitmap(0, 0, img.getWidth(), img.getHeight(), img, 0, 0);
                super.paint(graphics);
            }
            protected void sublayout(int maxWidth, int maxHeight) {
                super.sublayout( img.getWidth(), img.getHeight());
                setExtent( img.getWidth(), img.getHeight());
            }
        };
        BitmapField field=new BitmapField(back);
        field.setPadding(0, 0, 0, 0);
        manager.add(field);
        add(manager);
    }
}

我的屏幕截图:


通过使用另一个虚拟图像,可以确定原始图像的哪些像素需要删除(我们可以使它们透明)。虽然它可能不是最佳解决方案,但它可以应用于我们可以在黑莓上绘制的任何几何图形。

检查以下步骤:

  • 创建一个新的位图图像(dummyImage)与尺寸相同 源图像(myImage).
  • 使用定义的颜色在其上绘制(填充)目标几何形状 (fillColor).
  • 现在对于每个像素myImage,如果相同的像素dummyImage包含fillColor然后保持不变,否则使该像素 通过分配零来完全透明(0) to it.
  • Now myImage快准备好了,需要修剪此图像 透明像素去除。

以下代码将在图像上应用圆形裁剪。 (但不会修剪透明像素)。

package mypackage;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.container.MainScreen;

class MyScreen extends MainScreen {
    private Bitmap myImage = Bitmap.getBitmapResource("img/myImage.jpeg");
    private BitmapField _bf;

    public MyScreen() {
        _bf = new BitmapField(myImage);
        adjustBitmapMargin();
        add(_bf);
    }

    private void adjustBitmapMargin() {
        int x = (Display.getWidth() - myImage.getWidth()) / 2;
        int y = (Display.getHeight() - myImage.getHeight()) / 2;
        _bf.setMargin(y, 0, 0, x);
    }

    protected void makeMenu(Menu menu, int instance) {
        menu.add(miCropCircle);
        super.makeMenu(menu, instance);
    }

    private MenuItem miCropCircle = new MenuItem("Crop - Circle", 0, 0) {
        public void run() {
            cropImage();
        }
    };

    private void cropImage() {
        int width = myImage.getWidth();
        int height = myImage.getHeight();

        // get original data from the image
        int myImageData[] = new int[width * height];
        myImage.getARGB(myImageData, 0, width, 0, 0, width, height);

        // get default color of a newly created bitmap
        int defaultColors[] = new int[1 * 1];
        (new Bitmap(1, 1)).getARGB(defaultColors, 0, 1, 0, 0, 1, 1);

        int defaultColor = defaultColors[0];
        int fillColor = Color.RED;
        int diameter = 200;

        // dummy data preparation
        Bitmap dummyImage = new Bitmap(width, height);
        Graphics dummyImageGraphics = Graphics.create(dummyImage);
        dummyImageGraphics.setColor(fillColor);
        int startX = width / 2 - diameter / 2;
        int startY = height / 2 - diameter / 2;
        dummyImageGraphics.fillArc(startX, startY, diameter, diameter, 0, 360);
        int dummyData[] = new int[width * height];
        dummyImage.getARGB(dummyData, 0, width, 0, 0, width, height);

        // filling original data with transparent value.
        int totalPixels = width * height;
        for (int i = 0; i < totalPixels; i++) {
            if (dummyData[i] == defaultColor) {
                myImageData[i] = 0;
            }
        }

        // set new data
        myImage.setARGB(myImageData, 0, width, 0, 0, width, height);

        // redraw screen
        _bf.setBitmap(myImage);
        adjustBitmapMargin();
        invalidate();

        // free up some memory here
        defaultColors = null;
        dummyImage = null;
        dummyData = null;
        dummyImageGraphics = null;
    }
}


上述代码的输出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在黑莓中裁剪特定形状的图像? 的相关文章

  • 在 Android 版 Glide 中离线时加载已获取的图像

    我正在使用 Glide 版本 4 8 0 为了加载图像我这样做 GlideApp with HomePageFragment this load remoteURL diskCacheStrategy DiskCacheStrategy A
  • 使用 SSL 的 Xamarin.Forms Image.Source

    我正在使用一个在线商店来存储通过我们的应用程序上传的用户图像 并受 SSL 保护 上传工作一切顺利 因为我使用的是带有附加证书的 WebClient 但是当我尝试使用 Xamarin Forms Image 组件时 例如将源设置为 http
  • java设置图像的分辨率和打印尺寸

    我编写了一个程序 生成一个 BufferedImage 以显示在屏幕上 然后打印 图像的一部分包括 1 像素宽的网格线 即 一行为1个像素 行与行之间大约有10个像素 由于屏幕分辨率的原因 图像显示得比这大得多 每行有几个像素 我想将其绘制
  • 使用 scikit-image 和 Transform.PolynomialTransform 进行图像变形

    我附上一个压缩档案 https drive google com file d 0B6EnJ Vh6zs1MkVCRlNhZkJsOEk view usp sharing包含说明和重现问题所需的所有文件 我还没有上传图片的权限 我有一个带有
  • 在 Android 上将大位图文件的大小调整为缩放的输出文件

    我的文件中有一个大位图 例如 3888x2592 现在 我想将该位图大小调整为 800x533 并将其保存到另一个文件中 我通常会通过调用来缩放位图Bitmap createBitmap方法 但它需要一个源位图作为第一个参数 我无法提供它
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • 无法通过电子应用程序在discordjs上发送附加到消息的图像

    我正在尝试为我使用discordjs 编写的discord 机器人构建图形界面 但是 我在发送图像时遇到了问题 这是我的代码中负责向用户发送消息的部分 utilsateur createDM then channeltemp gt let
  • 使用无图像按钮有哪些优点?

    讨论关于这个答案 https stackoverflow com questions 520640 how can i use googles new imageless button how could i reverse enginee
  • 自定义列表字段点击事件

    我正在编写一个应用程序 其中我创建了用于显示列表视图的自定义列表字段 我的 CustomListField 包含连续的一个图像和文本 我正在通过单击列表字段行获取字段更改侦听器 但我也想将字段更改侦听器放在图像上 谁能告诉我我该怎么做 这是
  • IE10中的图像插值

    这是我的用例 我有一个采用响应式设计的网页 该页面垂直分成两半 我想在右侧显示图像 呈现为 PNG 或 JPG 的 PDF 页面 调整窗口大小后 图像的大小应立即更改 我以为我已经解决了这个问题 我将服务器上的图像渲染得足够大 以适应最大可
  • 如何使网页中出现的图标闪烁/闪烁

    几天前我开始研究高级java 我知道太晚了 我被困在使图标 出现在任务栏上 闪烁的特定任务上 这种闪烁应该根据特定条件发生 这意味着可以使用以下方法来实现javascript 我已经搜索了一段时间了 但是有没有办法让图标每隔 1 秒左右出现
  • 在 SQL Server 2005 IMAGE 列中存储 20 Meg 文件的最有效方法

    我们将文档存储在 SQL Server 2005 数据库表中 列格式为 Image 每次我尝试存储大于 1 Meg 的 PDF 文件时 它都会以某种方式损坏 NET 中是否有任何特别有效的方法来序列化大文件 10megs 并将其存储到数据库
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • 鼠标悬停时放大图像而不使用 Jquery 推送其他图像?

    当您将鼠标悬停在图像缩略图上 例如 Google 图片正在使用的缩略图 时 我正在尝试创建图像放大效果 但是 我遇到了一个问题 即放大的图像根据放大的图像的位置不断将另一张图像推到另一个位置 这是我到目前为止所拥有的
  • JavaFX:将像素写入 PixelWriter 的最快方法

    我正在寻找最快的方式来写入像素javafx scene image Image 写信给BufferedImage的后备数组要快得多 至少在我制作的测试图像上 只花了大约 20 毫秒BufferedImage WritableImage另一方
  • React App 中的图像损坏

    我正在尝试访问 React 应用程序中的图像 当我运行代码时 我在网页上看到一个损坏的图像图标 我不确定我是否正在访问图像的正确路径 我的代码如下 import React Component from react class Header
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • OpenCV:如何从网络摄像头获取原始 YUY2 图像?

    你知道如何获得吗raw YUY2来自网络摄像头的图像 使用 OpenCV DirectShow 无 VFW http opencv willowgarage com wiki CameraCapture http opencv willow
  • 如何为 BlackBerry 10 准备旧的 Blackberry 应用程序?

    我们有几个 Blackberry 应用程序 现在正在尝试为 BB 10 做好准备 这些应用程序是通过 Eclipse 和 或 RIM IDE 工具用 Java 制作的 然而 当我去https developer blackberry com

随机推荐

  • 混淆 ASP.Net dll 破坏 Web 应用程序

    我通常不会费心去混淆 Web 应用程序 DLL 但现在我必须与可能有利益冲突的人共享一些服务器空间 并且可能会试图窃取交易并反编译它 我知道这不是一个理想的解决方案 但是嘿 因此 我使用 VS 2005 一个 Web 部署项目 编译为单个
  • Getpass输入Python 3

    我正在尝试创建密码输入 我知道getpass getpass但是当我将其置于闲置状态时 它会出现错误 提示 密码可能会被回显 My code import getpass p getpass getpass print You entere
  • gremlin 语法计算 Jaccard 相似度度量

    我有兴趣计算图中未直接连接的所有顶点对的杰卡德相似度度量 Jaccard度量定义为两个顶点的邻居交集的范数除以相同集合的并集的范数 where 到目前为止 我已经能够获得所有未直接连接的节点对 仅对这种情况下的链接预测感兴趣 如果直接链接已
  • 其可能的 Google 表单脚本每天上午 00:01 至中午 12:00 自动打开和关闭

    我想每天 00 01 打开 google 表单并在 12 00 关闭 这是我的代码 function createDailyTrigger ScriptApp newTrigger openCloseFormTrigger timeBase
  • 由于 Integer.parseInt 导致崩溃

    我正在尝试从另一个文本文件中生成的文本导入文本Activity 生成的文本文件由String ArrayList其中仅包含数字和 Android 生成的其他随机文本 当我从文件导入文本时 我使用的是BufferedReader and re
  • 如何在Python中检查神经网络的层数以及何时应该增加层数?

    请对您的想法添加最少的评论 以便我可以改进我的查询 谢谢 我正在研究MNIST数据集并写一些CNN代码 然而 我对其中的一些观点感到困惑CNN代码 如何知道神经网络的层数 根据我目前的理解 我认为它有 6 层和 4 个隐藏层 是对的吗 如果
  • OpenGL 3:​​glBindVertexArray 使 GL_ELEMENT_ARRAY_BUFFER 无效

    我确信如果你通过绑定缓冲区glBindBuffer 您可以放心地假设它保持绑定状态 直到目标通过另一个调用反弹glBindBuffer 因此 当我发现调用时 我感到非常惊讶glBindVertexArray 将绑定到 GL ELEMENT
  • 在 Node 中渲染 HTML 字符串?

    好吧 我已经下载了 Express 设置端口process env PORT 8080 并设置应用程序变量var app express 现在 我想要完成的是不是通过文件渲染 HTML 我可以通过字符串来完成吗 var html n n n
  • 将 Word 保存为 UTF-8 编码的 HTML

    我正在编写一些 C VSTO 代码 用于读取 Microsoft Word 文档并将其保存到筛选的 HTML 当我对通用 Word 文档执行此函数时 html 文件的输出使用 Windows 字符集 如下所示 如果我打开一个文档并转到 文件
  • 自定义验证摘要模板 Asp.net MVC 3

    我正在开发一个使用 Asp Net MVC3 的项目 在我的视图中 Html ValidationSummary true 像往常一样它会产生 div class validation summary errors ul li Someth
  • Twinx/Secondary-y:不要从第一种颜色开始

    我有一个配色方案来自 plt style use ggplot so 我不想手动选取颜色 或从颜色循环器中选取它们 但是 当我有辅助轴时 fig ax plt subplots ax2 ax twinx ax plot np array 1
  • Scala 泛型和数字隐式

    我需要将两个函数作为参数传递给 scala 函数 然后 该函数应该评估它们并从中获取一个数字 然后对其进行操作 该数字可以是 Int Double 或任何其他数字类型 我希望该函数能够工作 无论它使用什么类型 下面的例子解释了这个问题 im
  • Android 中访问错误的原始资源

    我有以下代码 我的想法是在 OnCreate 中 我会将 res raw 中的文本文件中的一些类别填充到我的数据库中 首先按行对读取的文件进行标记 myCatToken 然后我再次拆分每个文件以获取 id 和名称 由于某种原因 我没有读取r
  • 如何仅从元素的一侧删除边框?

    I have
  • ReferenceError getValuesOfAutofillInputs,找不到变量:PaymentAutofillConfig [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 自 2022 年 6 月 2 日以来 我们的哨兵日志中一直面临代码中的引用错误 而且它只发生在 iOS iphone 设
  • 如何向网站发送查询并解析结果?

    我想用Java做一些开发 我希望能够访问一个网站 例如 www chipotle com 在右上角 您可以输入邮政编码 它会为您提供所有最近的位置 该程序只有一个空框供用户输入邮政编码 并且它将查询实际的 chipotle 服务器以检索最近
  • R 中值的累积计数

    我希望你做得很好 我想知道如何计算特定条件下数据集的累积和 我的数据集的简化版本如下所示 t id A 22 A 22 R 22 A 41 A 98 A 98 A 98 R 98 A 46 A 46 R 46 A 46 A 46 A 46
  • 在日期/因子向量字段上使用 sapply - 包括递增值

    我有一个带有缺失值的日期字段 因子类转换为字符串 我想用每个缺失值的序列号来填充该字段 到目前为止 这是我的代码 f lt function x counter if x counter counter 1 return toString
  • 非阻塞 BIO_do_connect 当没有互联网连接时被阻塞

    我使用 Openssl 0 9 8x 如下 bio BIO new ssl connect ctx BIO get ssl bio ssl SSL set mode ssl SSL MODE AUTO RETRY BIO set nbio
  • 如何在黑莓中裁剪特定形状的图像?

    大家好 感谢阅读我的回答希望你能帮助我 我正在黑莓手机上进行图像裁剪 在我的应用程序中包含 3 个主要内容 1 将图像加载到屏幕上 2 选择裁剪区域的形状 3 在下一个屏幕上显示裁剪图像而不丢失其形状 第1步 我可以完成图像加载部分 步骤2