获取图片中不规则形状的一部分

原图:


目标图:

目标图的效果是取得了原图中间部泡形状的部分。

获取方法:

首先,准备一张目标形状的背景图,这里我的背景图如下:

除黑色部分以外其余部分是透明的。

然后,就是代码了。

原理:先截取原图中响应位置的图片,然后取得背景图中各个像素的透明度,将该透明度赋值给截取后的图片,就ok了。


    public static Bitmap getBubbleImage(Bitmap src, Bitmap overlay) {
        //原图比背景图大时,截取得原图的中间部分;
        //原图比背景图小时,取整个原图;
        int width = src.getWidth();
        int height = src.getHeight();

        int w = overlay.getWidth();
        int h = overlay.getHeight();
        int offsetX = 0;
        int offsetY = 0;
        if (width > w) {
            offsetX = (width - w) / 2;
        }
        if (height > h) {
            offsetY = (height - h) / 2;
        }
        Matrix matrix = new Matrix();

        int newWidth = Math.min(w, width) - 2;
        int newHeight = Math.min(h, height) - 2;
        Bitmap bitmap = Bitmap.createBitmap(newWidth, newHeight,
                Bitmap.Config.ARGB_8888);
        Bitmap srcCopy = Bitmap.createBitmap(src, offsetX, offsetY, newWidth,
                newHeight, matrix, true);
        //获取背景图个像素的透明度值,赋值给截取后的图
        int pixColor = 0;
        int layColor = 0;
        int newColor = 0;

        int pixR = 0;
        int pixG = 0;
        int pixB = 0;
        int layA = 0;
        int[] srcPixels = new int[newWidth * newHeight];
        int[] overlayPixels = new int[newWidth * newHeight];
        int[] targetPixels = new int[newWidth * newHeight];

        srcCopy.getPixels(srcPixels, 0, newWidth, 0, 0, newWidth, newHeight);
        overlay.getPixels(overlayPixels, 0, newWidth, 0, 0, newWidth, newHeight);

        for (int i = 0; i < srcPixels.length; i++) {

            pixColor = srcPixels[i];
            layColor = overlayPixels[i];

            pixR = Color.red(pixColor);
            pixG = Color.green(pixColor);
            pixB = Color.blue(pixColor);
            layA = Color.alpha(layColor);

            newColor = Color.argb(layA, pixR, pixG, pixB);
            targetPixels[i] = newColor;
        }
        bitmap.setPixels(targetPixels, 0, newWidth, 0, 0, newWidth, newHeight);

        return bitmap;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CTF竞赛,如果需要从一张图片提取flag,通常有以下几种方式: 1. 使用steg工具进行隐写分析:steg工具可以检测和提取图片的隐藏信息,比如使用LSB隐写的信息、加密的信息等等。这些工具可以通过调整参数来发现隐藏的信息,从而找到flag。 2. 使用图像处理技术:通过使用Photoshop、GIMP等软件,对图片进行处理,比如将图片的通道进行调整,或者更改图片的亮度、对比度等。有时,flag可能以不同的颜色或亮度出现,通过调整图片可以找到它。 3. 人工查找:有时候,flag可能以文本的形式明确地出现在图片,这需要我们仔细查看图片,寻找不同的图案和形状,或者查找图片的元数据信息(如EXIF数据)。 需要注意的是,这些技术都需要一定的专业知识和经验,需要在实践不断学习和掌握。 ### 回答2: CTF (Capture The Flag) 是一种网络安全竞赛,其参与者需要寻找并获取特定的flag来获得积分。在CTF,有时图像提取是一项常见的挑战,参与者需要通过某种方式从给定的图像提取flag。 对于图像提取,可能会使用以下几种方式: 1. 手动分析:参与者可以使用图像编辑软件,如Photoshop或GIMP,在图像仔细检查每个像素,以寻找隐藏在图像的flag。这可能包括查看图像的元数据(如EXIF数据)或隐藏在图像的隐藏信息。 2. 隐写术:隐藏图像提取flag的一种常见方法是使用隐写术。隐写术是一种将信息隐藏在另一个媒体的技术。参赛者可以使用工具,如Steghide或Stegsolve,来检查图像是否存在隐藏的信息层。 3. 数据分析:图像是由像素组成的数据集。参与者可以使用编程语言(如Python)和图像处理库(如PIL或OpenCV)来分析图像的像素。通过检查像素或像素的特定模式,他们可以寻找可能包含flag的隐藏信息。 4. 频谱分析:参与者可以将图像转换为频域,并使用FFT(快速傅里叶变换)等变换方法来分析频谱。在频域,隐藏的模式可能更容易被检测到。 5. 简单的隐藏技巧:有时,flag可能会隐藏在图像的命名,如文件名或路径。参赛者应该注意到这些细节,并仔细检查图像的元数据。 总结来说,在CTF比赛提取图像的flag可能需要参赛者运用多种技术和工具。这可能包括手动分析图像、使用隐写术工具、编写代码进行数据分析,以及应用频谱分析等方法。熟练掌握这些技术和工具可以帮助参赛者更有效地提取flag。 ### 回答3: 在CTF竞赛,提取图像的flag通常可以通过以下几种方式来实现: 1. 字符串隐藏:这是最常见的方法之一。在图像文件的文件头、文件尾、元数据或像素嵌入flag字符串。可以通过检查图像的十六进制数据或使用图像处理工具来提取flag。 2. 隐写术:隐写术是一种将信息隐藏在其他媒体的技术。在图像隐藏flag可以使用不同的隐写术,如LSB(最低有效位)隐写、DCT(离散余弦变换)隐写等。这些技术将flag嵌入到像素或频域变换系数,使其在视觉上不可察觉。 3. 色彩编码:为了隐藏flag,可以使用特定的颜色编码方案。通过将像素的RGB与ASCII字符的编码相对应,可以在图像嵌入flag信息。提取flag时,需要根据颜色编码方案将图像的颜色对应到相应的ASCII字符来恢复原始信息。 4. 直接显示:在某些情况下,flag可能已经以明文形式直接在图像显示,而不需要进行任何隐藏操作。这种情况下,只需要仔细观察图像的各个部分,寻找与flag有关的信息即可。 需要注意的是,以上方法只是一些常见的图像提取flag的方式,实际情况会因CTF竞赛的具体规则和题目设计而有所不同。因此,在实际的CTF竞赛,掌握更多的图像处理技术和分析方法将有助于更有效地提取flag。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值