object c(主要語言) ,,數(shù)據(jù)庫至少一種(mysql),,ps(圖形處理)等等,,另外還要做電腦端的后臺管理,,jsp或asp或php等等至少一種,,另外最好用框架做,,ssh

創(chuàng)新互聯(lián)主營翁源網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app軟件開發(fā),翁源h5小程序設計搭建,翁源網(wǎng)站營銷推廣歡迎翁源等地區(qū)企業(yè)咨詢
在項目中經(jīng)常遇到要上傳圖片,如果直接上傳,那么會上傳比較大的圖片,導致費流量,刷新時加載圖片時間過長,手機內(nèi)存占用率高等問題。
一、先來介紹下概念:
圖片的壓縮其實是倆概念,
1、是 “壓” 文件體積變小,但是像素數(shù)不變,長寬尺寸不變,那么質量可能下降,
2、是 “縮” 文件的尺寸變小,也就是像素數(shù)減少。長寬尺寸變小,文件體積同樣會減小。
二、解決方法(以上傳頭像為例),先縮再壓:
2.1 矯正圖片方向(照片是有方向的,避免出現(xiàn)“倒立”的情況)
- (UIImage*)fixOrientation:(UIImage*)aImage {
// No-op if the orientation is already correct
if(aImage.imageOrientation==UIImageOrientationUp)
returnaImage;
// We need to calculate the proper transformation to make the image upright.
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
CGAffineTransformtransform =CGAffineTransformIdentity;
switch(aImage.imageOrientation) {
caseUIImageOrientationDown:
caseUIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
transform =CGAffineTransformRotate(transform,M_PI);
break;
caseUIImageOrientationLeft:
caseUIImageOrientationLeftMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width,0);
transform =CGAffineTransformRotate(transform,M_PI_2);
break;
caseUIImageOrientationRight:
caseUIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform,0, aImage.size.height);
transform =CGAffineTransformRotate(transform, -M_PI_2);
break;
default:
break;
}
switch(aImage.imageOrientation) {
caseUIImageOrientationUpMirrored:
caseUIImageOrientationDownMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.width,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
caseUIImageOrientationLeftMirrored:
caseUIImageOrientationRightMirrored:
transform =CGAffineTransformTranslate(transform, aImage.size.height,0);
transform =CGAffineTransformScale(transform, -1,1);
break;
default:
break;
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRefctx =CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
CGImageGetBitsPerComponent(aImage.CGImage),0,
CGImageGetColorSpace(aImage.CGImage),
CGImageGetBitmapInfo(aImage.CGImage));
CGContextConcatCTM(ctx, transform);
switch(aImage.imageOrientation) {
caseUIImageOrientationLeft:
caseUIImageOrientationLeftMirrored:
caseUIImageOrientationRight:
caseUIImageOrientationRightMirrored:
CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
break;
default:
CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
break;
}
CGImageRef cgimg =CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImageimageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}
2.2 拿到上面矯正過的圖片,縮小圖片尺寸,調(diào)用下面方法傳入newSize,如(200,200):
+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[imagedrawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
2.3 將2.2的圖片再壓,這個方法可以重復壓
//調(diào)整大小
NSData *imageData =UIImageJPEGRepresentation(newImage,rate);
NSUIntegersizeOrigin = [image Datalength];//多少KB
NSUIntegersizeOriginKB = sizeOrigin /1024;//多少KB
2.4 上傳頭像
調(diào)用后臺接口,把imageData二進制數(shù)據(jù)上傳即可
總結:對圖片壓縮處理時,在保證圖片清晰度變化不大時,減小圖片文件大小。方法2.2中的newSize 和 2.3中的rate要以實際效果來設置,我在自己項目中上傳的頭像最終尺寸是200*200像素,大小為4KB左右。
對于iOS開發(fā)者而言,想要打造一款美圖App,最佳首選的開源框架莫過于GPUImage。它內(nèi)嵌了上百種圖像濾鏡,能夠滿足市面上的一切美顏開發(fā)方案。同時也具備了實時美顏的功能。通過這樣強大的開源框架,我們可以在其上層開發(fā)屬于我們自己的美圖應用。SnapseedImitation 是以Snapseed為原型,利用GPUImage框架開發(fā)的圖像處理軟件。
SnapseedImitation
Github地址:
主要依賴GPUImage Github:
1.安裝Cocoapods
2.pod 'GPUImage'
3. improt 導入GPUImage.h后編譯即可。
通過GPUImagePicture獲取待編輯圖像,再經(jīng)過GPUImageFilter渲染后產(chǎn)出一幀frame,經(jīng)由消息管道通知后,便可在GPUImageView顯示編輯后的圖片,或者我們可以通過GPUImageFilter直接導出渲染后的UIImage。
GPUImageInputGPUImageFilterGPUImageOutput
以拉升變形濾鏡為例:
//@拉升變形鏡濾鏡
//創(chuàng)造輸入源
GPUImagePicture* gpupicture = [[GPUImagePicturealloc]initWithImage:[UIImageimageNamed:@"Duck.jpg"]];
//創(chuàng)建濾鏡
PUImageStretchDistortionFilter* stretchDistortionFilter = [GPUImageStretchDistortionFilternew];
//為濾鏡賦值
stretchDistortionFilter.center=CGPointMake(0.2,0.2);
//將輸入源和濾鏡綁定
[gpupicture addTarget:stretchDistortionFilter];
//為原圖附上濾鏡效果[gpupicture processImage];
//濾鏡收到原圖產(chǎn)生的一個frame,并將它作為自己的當前圖像緩存
[stretchDistortionFilter useNextFrameForImageCapture];
//通過濾鏡,獲取當前的圖像。
UIImage*image = [stretchDistortionFilter imageFromCurrentFramebuffer];
圖像拉升變形前后對比 :
開發(fā)過程中,必然會有多種濾鏡復合的需求,例如一個可以變化亮度、對比度、曝光的圖像調(diào)節(jié)程序。但是依照上一個示例,我們每添加一種濾鏡,便會代替之前的濾鏡效果。如果每次處理的都是上一次的filter導出的UIImage圖片的話,又會導致無法恢復到原圖樣子,導致失真。(可參考在繪畫板中,把圖片縮小到最小,再放大,圖片變成為了一個像素塊。)
這時候,我們需要一個很好用的類:GPUImageFilterPipeline
GPUImageFilterPipeline可以將多個濾鏡進行復合,并且在多次處理后,仍然能夠恢復成為原圖不失真。
仍然以拉升變形和卡通描邊效果為例 :
//獲取原圖
GPUImagePicture* gpupicture = [[GPUImagePicturealloc]initWithImage:[UIImageimageNamed:@"Duck.jpg"]];
//輸出圖像的
ViewGPUImageView* gpuimageView = [[GPUImageViewalloc]initWithFrame:CGRectMake(0,60,320,320)];[self.viewaddSubview:gpuimageView];
//卡通描邊濾鏡
GPUImageToonFilter* toonFilter = [GPUImageToonFilternew];toonFilter.threshold=0.1;
//拉升變形濾鏡
GPUImageStretchDistortionFilter* stretchDistortionFilter = [GPUImageStretchDistortionFilternew];
stretchDistortionFilter.center=CGPointMake(0.5,0.5);
//將濾鏡組成數(shù)組
NSArray* filters = @[toonFilter,stretchDistortionFilter];
//通過pipline,將輸入源,輸出,濾鏡,三方綁定
GPUImageFilterPipeline* pipLine = [[GPUImageFilterPipelinealloc]initWithOrderedFilters:filters input:self.gpupictureoutput:self.gpuimageView];
//繪制產(chǎn)出最終帶有復合濾鏡的圖像。
[self.gpupictureprocessImage];
//獲取產(chǎn)出的UIImage圖像
//此時調(diào)用useNextFrameForImageCapture的可以是任一在數(shù)組中的Filter。
[stretchDistortionFilter useNextFrameForImageCapture];
UIImage* image = [self.pipLinecurrentFilteredFrame];
基于GPUImage框架,我為其添加了一套了Snapseed的UI,通過手勢識別方案對圖像濾鏡進行調(diào)節(jié)拖控。
更多內(nèi)容:
GPUImage 進階學習,實時視頻錄制,人臉檢測
簡單直接有效的方法就是用圖像處理軟件對它進行處理就好了數(shù)碼象機拍的照片像素高所以容量就大 對他處理一下就好了 不影響圖片的清晰度!ACDSee 就是一個很不錯的圖片瀏覽和處理圖片的好東西 處理方式非常簡單 一個批量處理 4M左右的照片可以處理到400KB-600KB左右當然容量的大小朋友可以自己確定 處理后的圖片清晰度不受什么影響
下圖為 iOS APP 圖形渲染框架, APP 在顯示可視化的圖形時,使用到了 Core Animation 、 Core Graphics 、 Core Image 等框架,這些框架在渲染圖形時,都需要通過 OpenGL ES / Metal 來驅動 GPU 進行渲染與繪制。
UIKit 是 iOS 開發(fā)者最常用的框架,里面提供了 UIView 。
UIView 供開發(fā)者用來:
Core Animation 源自于 Layer Kit, 是一個復合引擎,主要職責包含渲染( CALayer )、構建和實現(xiàn)動畫。 CALayer 是用戶所能在屏幕上看到一切的基礎。
Core Graphics 是基于Quartz 的高級繪圖引擎,主要用于運行時繪制圖像。其功能有繪制路徑、顏色管理、漸變、陰影、創(chuàng)建圖像、圖像遮罩、PDF文檔創(chuàng)建顯示及分析。
Core Image 擁有一系列現(xiàn)成的圖像過濾器,可以對已存在的圖片進行高效處理。大部分情況下,``Core Image ``` 是在GPU中完成工作,如果GPU忙,會使用CPU進行處理。
Core Animation 、 Core Graphics 、 Core Image 這個三個框架間也存在著依賴關系。
上面提到 CALayer 是用戶所能在屏幕上看到一切的基礎。所以 Core Graphics 、 Core Image 是需要依賴于 CALayer 來顯示界面的。由于 CALayer 又是 Core Animation 框架提供的,所以說 Core Graphics 、 Core Image 是依賴于``Core Animation ```的。
上文還提到每一個 UIView 內(nèi)部都關聯(lián)一個 CALayer 圖層,即 backing layer ,每一個 CALayer 都包含一個 content 屬性指向一塊緩存區(qū),即 backing store , 里面存放位圖(Bitmap)。 iOS 中將該緩存區(qū)保存的圖片稱為 寄宿圖 。
這個寄宿圖有兩個設置方式:
CALayer 是如何調(diào)用 GPU 并顯示可視化內(nèi)容的呢?下面我們就需要介紹一下 Core Animation 流水線的工作原理。
事實上,app 本身并不負責渲染,渲染則是由一個獨立的進程負責,即 Render Server 進程。
App 通過 IPC 將渲染任務及相關數(shù)據(jù)提交給 Render Server 。 Render Server 處理完數(shù)據(jù)后,再傳遞至 GPU。最后由 GPU 調(diào)用 iOS 的圖像設備進行顯示。
Core Animation 流水線的詳細過程如下:
對上述步驟進行串聯(lián),它們執(zhí)行所消耗的時間遠遠超過 16.67 ms,因此為了滿足對屏幕的 60 FPS 刷新率的支持,需要將這些步驟進行分解,通過流水線的方式進行并行執(zhí)行,如下圖所示。
在 Core Animation 流水線中,app 調(diào)用 Render Server 前的最后一步 Commit Transaction 其實可以細分為 4 個步驟:
參考文章: iOS 圖像渲染原理
在 iOS 開發(fā)過程中,對圖片的處理不僅僅局限于顯示、渲染樣式,還常常遇到對view指定區(qū)域截圖,以及對圖片的壓縮、拉伸等操作。下面我們介紹一下類似的操作過程:
注:通過 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) 和 drawViewHierarchyInRect 的配合來截取并渲染出來的圖片位置和大小,是由前者的size和后者的rect共同決定的。 即,畫布相當于父view,其尺寸為size,截圖繪制到畫布中的位置和尺寸為rect。
想試一試的同學,可以創(chuàng)建一個demo,取不同的size和rect值,來觀察畫布和截圖的位置。也可以試著將畫布和截圖完全吻合,即將截圖完整的渲染出來,這并不難。
裁剪圖片就是對當前的圖片按照指定的大小范圍生成一個新的圖片。需要注意的是如果當前顯示圖片是2倍圖或者3倍圖,要么可能尺寸不對,要么截出來的圖片很模糊,因此,需要在截圖前調(diào)整rect值。
注:UIImageJPEGRepresentation 兩個參數(shù):圖片引用 和壓縮系數(shù),而 UIImagePNGRepresentation 只需圖片引用作為參數(shù)。在實際使用過程中,UIImagePNGRepresentation(UIImage* image) 一般要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的圖片數(shù)據(jù)量大,在處理圖片時,若對圖片質量要求不高,則建議使用UIImageJPEGRepresentation,根據(jù)自己的實際使用場景設置壓縮系數(shù),進一步降低圖片數(shù)據(jù)量大小。
在 = iOS 5.0 時,UIImage的新方法可以處理圖片的拉伸問題:
使用過程:
在 = iOS 6.0 時,UIImage的新方法可以處理圖片的拉伸問題:
使用過程:
參考文章:
分享文章:ios開發(fā)圖像處理,ios圖片渲染機制
文章來源:http://chinadenli.net/article25/dsgicci.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、電子商務、App開發(fā)、微信公眾號、虛擬主機、關鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)