在过去的几周里,我一直在使用 Objective-c 处理图像,并注意到许多奇怪的行为。首先,像许多其他人一样,我遇到了这样的问题:用相机拍摄的图像(或用别人的相机拍摄并发送给我的彩信)旋转了 90 度。我不确定为什么会发生这种情况(因此 my question),但我能够想出一个便宜的解决方法。
我这次的问题是为什么会发生这种情况 ?苹果为什么要旋转图像?当我用相机正面朝上拍照时,除非我执行上面提到的代码,否则当我保存照片时,它会旋转保存。现在,直到几天前,我的解决方法还可以。
我的应用程序修改了图像的单个像素,特别是 PNG 的 alpha channel (因此对于我的场景,任何 JPEG 转换都会被抛出窗口)。几天前,我注意到即使由于我的解决方法代码,图像在我的应用程序中正确显示,当我的算法修改图像的单个像素时,它认为图像已旋转。所以不是修改图像顶部的像素,而是修改图像侧面的像素(因为它认为应该旋转)!我不知道如何在内存中旋转图像 - 理想情况下,我宁愿抹掉那个 imageOrientation一起标记。
这里还有一些让我感到困惑的东西......当我拍照时,imageOrientation设置为 3。我的解决方法代码足够聪明,可以实现这一点并将其翻转,以便用户永远不会注意到。此外,我将图像保存到库的代码实现了这一点,翻转它,然后保存它,使其正确出现在相机胶卷中。
该代码如下所示:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
imageOrientation是 0 - 正是我想看到的,我的旋转解决方法甚至不需要运行(注意:当从互联网加载图像而不是用相机拍摄的图像时,imageOrientation 始终为 0,从而完美行为)。出于某种原因,我的保存代码似乎抹去了这个 imageOrientation旗帜。我希望只要用户拍照并将其添加到应用程序中,就可以窃取该代码并使用它来删除我的 imageOrientation ,但它似乎不起作用。是否UIImageWriteToSavedPhotosAlbum用 imageOrientation 做一些特别的事情?imageOrientation一旦用户完成拍摄图像。我认为 Apple 执行旋转行为是有原因的,对吗?一些人认为这是 Apple 的缺陷。



最佳答案
我对它进行了研发并发现,每个图像文件都有元数据属性。如果元数据指定了通常被其他操作系统(但 Mac 除外)忽略的图像的方向。大多数拍摄的图像都将其元数据属性设置为直角。所以 Mac 以 90 度旋转的方式显示它。您可以在 Windows 操作系统中以正确的方式看到相同的图像。
有关更多详细信息,请阅读此答案 http://graphicssoft.about.com/od/digitalphotography/f/sideways-pictures.htm
尝试在此处阅读图像的 exif http://www.exifviewer.org/ , 或 http://regex.info/exif.cgi , 或 http://www.addictivetips.com/internet-tips/view-complete-exif-metadata-information-of-any-jpeg-image-online/
关于iphone - iOS 图像方向有奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10600613/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje