graphics buffer保存成图片

Android GraphicBuffer的dump保存成yuv文件
https://blog.csdn.net/liwenjie28/article/details/114830221

高通Android平台-应用空间操作framebuffer dump LCD总结
https://blog.csdn.net/eliot_shao/article/details/74926010

Android 图像显示系统 - 导出图层数据的方法介绍(dump GraphicBuffer raw data)
https://www.shuzhiduo.com/A/o75N78GedW/

高通平台dump graphics:
vendor.gralloc.disable_ubwc=1 ,ubwc禁掉
hlos_dev_la\lagvm\LINUX\android\frameworks\native\libs\renderengine\skia\SkiaGLRenderEngine.cpp
#include <cutils/properties.h>
#include <sys/stat.h>

status_t SkiaGLRenderEngine::drawLayers() {
char pro_value[256];
property_get(“debug.buffer.dump”,pro_value,0);
if(!strcmp(pro_value,“true”))
{
ALOGE(“dump_content_of_layers_to_file!”);
for (auto const layer : layers) {
if (layer->source.buffer.buffer != nullptr) {
sp gBuf = layer->source.buffer.buffer->getBuffer();
uint32_t height = gBuf->getHeight();
if (height < 1200) {
continue;
}
dump_content_of_layers_to_image(gBuf);
}
}
}
}

void SkiaGLRenderEngine::dump_content_of_layers_to_file(const sp& target)
{
ALOGE(“dump_content_of_layers_to_file begain”);
int result = -1;
void *addr = NULL;
static int DumpSurfaceCount = 0;
int32_t bufStride;
FILE * pfile = NULL;
char layername[100] ;
memset(layername,0,sizeof(layername));

uint32_t w, s, h, f;
w = target->getWidth();
h = target->getHeight();
s = target->getStride();
f = target->getPixelFormat();
android_dataspace d;
uint32_t buffer_size = 0;
d = HAL_DATASPACE_UNKNOWN;
buffer_size = s * h * bytesPerPixel(f);
bufStride = bytesPerPixel(f);
ALOGE("buffer_layer info w:%d h:%d s:%d f:%d d:%d size:%d", w, h, s, f, d, buffer_size);
if (DumpSurfaceCount > 120) {
    DumpSurfaceCount = 0;
    property_set("debug.buffer.dump", "false");
}
sprintf(layername,
	"/data/local/tmp/buffer_layer_%d_frame_%d_%d_%d.yuv",
	DumpSurfaceCount,
	w,
	h,
	bufStride);

ALOGE("The dump  file info : %s", layername);
DumpSurfaceCount ++;
pfile = fopen(layername,"w+");
if(pfile)
{
    ALOGE("pfile dump  file info : %p", pfile);
    //获取FrameBufferSurface对应的ion地址
    result = target->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &addr);
    
    if(addr != NULL){
        ALOGE("The addr : %p", addr);
        int result = -1;
        // system("mkdir /data/dump && chmod 777 /data/dump");
        result = fwrite( (const void *)addr,
                (size_t)( (buffer_size)),
                1,
                pfile);
        if(result >0){
            ALOGE("fwrite success!");
        }else{
            ALOGE("fwrite failed error %d", result);
        }
    }else{
        ALOGE("lock buffer error!");
    }
    fclose(pfile);
    target->unlock();
}
ALOGE("end The dump  file info : %s", layername);

}

void SkiaGLRenderEngine::dump_content_of_layers_to_image(const sp& layerBuffer) {
if (layerBuffer.get() == nullptr) {
return;
}

static int sDumpCount = 0;
uint32_t width = layerBuffer->getWidth();
uint32_t height = layerBuffer->getHeight();
uint32_t stride = layerBuffer->getStride();
int32_t format = layerBuffer->getPixelFormat();
uint32_t buffer_size = stride * height * bytesPerPixel(format);
if (sDumpCount > 300) {
    sDumpCount = 0;
    property_set("debug.buffer.dump", "false");
}
char layerName[100] = {0};
sprintf(layerName, "/data/dump/gpu_layer_%u_frame_%u_%u_%u.jpg", sDumpCount++, width, height, buffer_size);
ALOGI("%s ,dumplayer buffer raw data to file :%s, format:%d,width %d,stride %d,", __FUNCTION__, layerName, format,width,stride);

int fd = -1;
fd = open(layerName, O_WRONLY | O_CREAT | O_TRUNC, 0664);
void* vaddr = nullptr;
status_t err = layerBuffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &vaddr);
if (fd != -1 && NO_ERROR == err && vaddr != nullptr) {
	uint32_t c = 0x1;
	write(fd, &width, 4);
    write(fd, &height, 4);
    write(fd, &format, 4);
    write(fd, &c, 4);
	size_t Bpp = bytesPerPixel(format);
	 for (size_t y=0 ; y<height ; y++) {
        write(fd, vaddr, width*Bpp);
        vaddr = (void *)((char *)vaddr + stride*Bpp);
    }
	 close(fd);
}    

}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM4是一种对称加密算法,可以用于Android图片文件的加密和解密。以下是一个简单的示例代码,演示如何使用SM4加密和解密图片文件: ```java import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Base64; import com.tongtech.cryptolib.SM4Utils; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class ImageUtils { /** * 加密图片文件 * * @param context 上下文对象 * @param imagePath 图片文件路径 * @param key 密钥 * @param iv 初始向量 * @param encryptDir 加密后保存的目录 * @return 加密后的图片文件路径 * @throws Exception */ public static String encryptImage(Context context, String imagePath, String key, String iv, String encryptDir) throws Exception { // 读取图片文件 FileInputStream inputStream = new FileInputStream(imagePath); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } byte[] data = outputStream.toByteArray(); inputStream.close(); outputStream.close(); // 使用SM4算法加密数据 SM4Utils sm4Utils = new SM4Utils(); sm4Utils.setSecretKey(key); sm4Utils.setIv(iv); byte[] encryptedData = sm4Utils.encryptData_ECB(data); // 将加密后的数据转换Base64编码字符串 String base64Data = Base64.encodeToString(encryptedData, Base64.DEFAULT); // 将加密后的数据写入文件 String encryptedPath = encryptDir + "/encrypted_image.jpg"; FileOutputStream outputStream1 = new FileOutputStream(encryptedPath); outputStream1.write(base64Data.getBytes()); outputStream1.close(); return encryptedPath; } /** * 解密图片文件 * * @param context 上下文对象 * @param encryptedPath 加密后的图片文件路径 * @param key 密钥 * @param iv 初始向量 * @return 解密后的Bitmap对象 * @throws Exception */ public static Bitmap decryptImage(Context context, String encryptedPath, String key, String iv) throws Exception { // 读取加密后的数据 FileInputStream inputStream = new FileInputStream(encryptedPath); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } String base64Data = outputStream.toString(); byte[] encryptedData = Base64.decode(base64Data, Base64.DEFAULT); inputStream.close(); outputStream.close(); // 使用SM4算法解密数据 SM4Utils sm4Utils = new SM4Utils(); sm4Utils.setSecretKey(key); sm4Utils.setIv(iv); byte[] data = sm4Utils.decryptData_ECB(encryptedData); // 将解密后的数据转换Bitmap对象 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); return bitmap; } } ``` 需要注意的是,加密和解密时使用的密钥和初始向量应该保持一致,否则解密会失败。另外,该示例中使用的是SM4算法的ECB模式,也可以使用其他模式,如CBC等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值