我想从jpegs中提取缩略图,没有任何外部库.我的意思是这并不太难,因为我需要知道缩略图的起始位置,并在文件中结束,然后简单地剪切它.我研究了许多文档(即:http://www.media.mit.edu/pia/Research/deepview/exif.html),并尝试分析jpeg,但并非一切都清楚.我试图逐步跟踪字节,但在深度我困惑.是否有任何好的文档或可读的源代码来提取有关jpeg文件中缩略图开始和结束位置的信息?
谢谢!
我需要为项目编写优化的NEON代码,我非常乐意编写汇编语言,但为了便携性/可维护性,我使用的是NEON instrinsics.这段代码需要尽可能快,所以我利用我在ARM优化方面的经验来正确地交错指令并避免管道停顿.无论我做什么,GCC都会对我起作用,并且会创建更慢的代码.
有谁知道如何让GCC摆脱困境并将我的内在函数转换为代码?
这是一个例子:我有一个简单的循环来否定和复制浮点值.它一次使用4组4个,以便为内存加载和执行指令留出一些时间.剩下很多寄存器,所以它没有理由把事情搞糟.
float32x4_t f32_0, f32_1, f32_2, f32_3;
int x;
for (x=0; x<n-15; x+=16)
{
f32_0 = vld1q_f32(&s[x]);
f32_1 = vld1q_f32(&s[x+4]);
f32_2 = vld1q_f32(&s[x+8]);
f32_3 = vld1q_f32(&s[x+12]);
__builtin_prefetch(&s[x+64]);
f32_0 = vnegq_f32(f32_0);
f32_1 = vnegq_f32(f32_1);
f32_2 = vnegq_f32(f32_2);
f32_3 = vnegq_f32(f32_3);
vst1q_f32(&d[x], f32_0);
vst1q_f32(&d[x+4], f32_1);
vst1q_f32(&d[x+8], f32_2);
vst1q_f32(&d[x+12], f32_3);
}
Run Code Online (Sandbox Code Playgroud)
这是它生成的代码:
vld1.32 {d18-d19}, [r5]
vneg.f32 q9,q9 <-- GCC intentionally causes stalls
add r7,r7,#16
vld1.32 {d22-d23}, [r8]
add r5,r1,r4
vneg.f32 q11,q11 <-- all of my interleaving is undone (why?!!?)
add r8,r3,#256 …
Run Code Online (Sandbox Code Playgroud) 我的应用程序是 iOS 的图像查看器。我允许用户从相机胶卷或云文件提供商中选择文件。对于选择的每个文件,我创建一个书签,以便用户稍后返回查看该文件,而无需再次执行相机胶卷/云文件选择器的所有步骤。相机胶卷书签始终工作,但云文件提供程序书签会随机失败,因为从调用返回 nil URLByResolvingBookmarkData
。返回的错误是:
“文件未找到”
来自 iCloud、DropBox、Box、Google Drive 等的文件会发生这种情况。以下是我创建和检索书签的方法:
// bookmark created from url returned by UIDocumentPickerViewController
NSData *bookmark = [url bookmarkDataWithOptions:options includingResourceValuesForKeys:nil relativeToURL:url error: nil];
// retrieving the URL from this bookmark works for a short time, then returns nil
url = [NSURL URLByResolvingBookmarkData:bookmark options:NSURLBookmarkResolutionWithoutUI relativeToURL:nil bookmarkDataIsStale:&isStale error:&error];
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么书签会工作一段时间,然后就失败了?存储/RAM 有限?
我有一种感觉,答案是从云存储中保留文件的本地副本,因为不能保证它们可以多次访问。
我正在拍摄照片查看器.在这种情况下,我写了一个小类,以便能够读取和使用一些EXIF数据,例如图像方向.这门课程适合阅读.
但是,我会添加一个新选项来旋转照片.我想旋转并写入照片数据本身,而不仅仅是重写方向标签.我已经编写了代码来旋转并保存主JPEG图像,它运行良好.但是我还需要旋转EXIF数据中包含的缩略图(如果有的话),以保持图像的连贯性.出于这个原因,我需要写入EXIF数据,以替换现有的缩略图.
但这提出了一些问题,我在回答时遇到了一些麻烦,即:
问候
我正在编写我自己的 DNS 黑洞来阻止我家庭网络上的广告和恶意软件。我意识到这种类型的程序已经存在,但我想学习这个过程并编写自己的程序。从 Linux 文档中,似乎可以告诉 sendmsg() 使用不同的返回地址,以便可以转发 UDP 数据包,并且接收服务器会将响应发送给原始请求者而不是我的服务器。从稀疏文档中,我设置了绑定到端口 53 (DNS) 的套接字。我正在接收 DNS 请求,解释它们并在站点被列入黑名单时做出响应。对于“好”域名,我得到了 2 个不同的结果。在 MacOS 上,我发送了转发请求,但响应返回到我的程序而不是原始请求者。在 Linux(Armbian 4.13 内核)上,我从 sendmsg() 调用中获得 EINVAL,但没有发送任何内容。任何人都可以阐明我做错了什么吗?(为简洁起见,已删除所有错误检查)
附加信息...这个方案的一个问题是原始 DNS 请求绑定到 53 以外的套接字端口(显然)。如何告诉 sendmsg() 将响应返回到原始请求的正确端口号?
我的“代理”版本有效。我存储了原始请求的事务 ID 和请求端口号,并且能够成功返回响应
最新消息 - 我能够成功完成我想要的,但没有使用 sendmsg()。通过使用 RAW 套接字并“欺骗”IP 标头中的返回地址,我能够将数据包发送回不同的返回地址和端口号(使用 sendto)。nslookup 认为这是一个问题,但浏览器可以接受。我想我们可以称之为“案件结束”
struct sockaddr_in addr, addrfrom, fwaddr;
socklen_t addrLen = sizeof(struct sockaddr_in);
int rc, listen_sock;
listen_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
rc = 1;
setsockopt(listen_sock, IPPROTO_IP, IP_PKTINFO, &rc, sizeof(rc));
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(53); // port …
Run Code Online (Sandbox Code Playgroud)