iOSで画像を取り込んで色を反転させたい。プログラムで画像の色を反転できますか?
答えて
私は自分のプロジェクトから関連するソースコードを持っているので、CPU上でのピクセル操作に落とす必要がある場合は、次のプレゼンテーションを追加する必要がありますトリック:
@implementation UIImage (NegativeImage)
- (UIImage *)negativeImage
{
// get width and height as integers, since we'll be using them as
// array subscripts, etc, and this'll save a whole lot of casting
CGSize size = self.size;
int width = size.width;
int height = size.height;
// Create a suitable RGB+alpha bitmap context in BGRA colour space
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *memoryPool = (unsigned char *)calloc(width*height*4, 1);
CGContextRef context = CGBitmapContextCreate(memoryPool, width, height, 8, width * 4, colourSpace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colourSpace);
// draw the current image to the newly created context
CGContextDrawImage(context, CGRectMake(0, 0, width, height), [self CGImage]);
// run through every pixel, a scan line at a time...
for(int y = 0; y < height; y++)
{
// get a pointer to the start of this scan line
unsigned char *linePointer = &memoryPool[y * width * 4];
// step through the pixels one by one...
for(int x = 0; x < width; x++)
{
// get RGB values. We're dealing with premultiplied alpha
// here, so we need to divide by the alpha channel (if it
// isn't zero, of course) to get uninflected RGB. We
// multiply by 255 to keep precision while still using
// integers
int r, g, b;
if(linePointer[3])
{
r = linePointer[0] * 255/linePointer[3];
g = linePointer[1] * 255/linePointer[3];
b = linePointer[2] * 255/linePointer[3];
}
else
r = g = b = 0;
// perform the colour inversion
r = 255 - r;
g = 255 - g;
b = 255 - b;
// multiply by alpha again, divide by 255 to undo the
// scaling before, store the new values and advance
// the pointer we're reading pixel data from
linePointer[0] = r * linePointer[3]/255;
linePointer[1] = g * linePointer[3]/255;
linePointer[2] = b * linePointer[3]/255;
linePointer += 4;
}
}
// get a CG image from the context, wrap that into a
// UIImage
CGImageRef cgImage = CGBitmapContextCreateImage(context);
UIImage *returnImage = [UIImage imageWithCGImage:cgImage];
// clean up
CGImageRelease(cgImage);
CGContextRelease(context);
free(memoryPool);
// and return
return returnImage;
}
@end
は、だから、そのUIImageするカテゴリのメソッドを追加します。
- はそれが
- のメモリにアクセスすることができる明確なCoreGraphicsビットマップコンテキストを作成し、それにUIImageを描く の
- 全ての画素を通る、インフレクションRGBにあらかじめ乗算アルファからの変換、個別チャネルを反転、再びアルファで乗算し、格納バック
- コンテキストから画像を取得し、UIImage
- にそれをラップ自体後にクリーンアップし、 UIImageを返す
もちろん、「差分」ブレンドモード(kCGBlendModeDifference
)を使用している可能性があります。イメージ処理を設定するコードの概要については、this questionを参照してください。イメージを下(ベース)イメージとして使用し、その上に純粋な白いビットマップを描画します。
CGImageRef
を取得してビットマップコンテキストに描画し、ビットマップコンテキストのピクセルをループすることで、ピクセル単位の操作を手動で行うこともできます。
@ Tommyの答えを置き換えるコードを入力してください(これは私が今使用しています)。 –
素晴らしい、素晴らしい解決策。 – sabiland
Tommyの答えは答えですが、私はそれが大きな画像のために本当に激しく時間のかかる作業であることを指摘したいと思います。そこ画像を操作であなたを助けることができる2つのフレームワーク:
- CoreImage
- アクセラレータ
とブラッドラーソン、GPUImageから素晴らしいGPUImageフレームワークは、ルーチンが独自のフラグメントを使用してGPU上で実行可能に言及することは本当に価値がありますOpenGlES 2.0環境でのシェーダの大幅な高速化CoreImgeを使用すると、負のフィルタが使用可能な場合、CPUまたはGPUを選択できます。アクセラレータを使用すると、CPUで実行されるすべてのルーチンがベクトル演算処理を使用します。 CoreImageで
@ Tommyの答えを置き換えるコードを提供してください(私は今使っています)。 –
https://developer.apple.com/library/mac/documentation/graphicsimaging/Conceptual/CoreImaging/ci_intro/ci_intro.htmlこちらから確認してください。https://developer.apple.com/library/ios/ documentation/Performance/Conceptual/vImage/Introduction/Introduction.html#// apple_ref/doc/uid/TP30001001を参照してください。アップルサイトでは、いくつかのサンプルを見つけることもできます – Andrea
:ちょうどこれを行うには迅速な拡張機能を作成し
#import <CoreImage/CoreImage.h>
@implementation UIImage (ColorInverse)
+ (UIImage *)inverseColor:(UIImage *)image {
CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIColorInvert"];
[filter setValue:coreImage forKey:kCIInputImageKey];
CIImage *result = [filter valueForKey:kCIOutputImageKey];
return [UIImage imageWithCIImage:result];
}
@end
最後の行は次のようになるでしょう: [UIImage imageWithCIImage:result scale:image.scale orientation:image.imageOrientation]; であり、元の画像の縮尺や向きが保持されます。 – prewett
。
extension UIImage {
func inverseImage(cgResult: Bool) -> UIImage? {
let coreImage = UIKit.CIImage(image: self)
guard let filter = CIFilter(name: "CIColorInvert") else { return nil }
filter.setValue(coreImage, forKey: kCIInputImageKey)
guard let result = filter.valueForKey(kCIOutputImageKey) as? UIKit.CIImage else { return nil }
if cgResult { // I've found that UIImage's that are based on CIImages don't work with a lot of calls properly
return UIImage(CGImage: CIContext(options: nil).createCGImage(result, fromRect: result.extent))
}
return UIImage(CIImage: result)
}
}
Swift 3に更新してください。thx –
スウィフト3更新:(@BadPirate回答からCIImageベースUIImagesは(ほとんどの図書館はCGImageが設定されていると仮定)打破するためにも、私は修正CIImageに基づいてUIImageを返すためのオプションを追加しました)
- 1. Macで画面の色をプログラムで反転する方法
- 2. 画像の色をプログラムで変更できますか?
- 3. アンドロイドで画像を反転/反転/カールする方法
- 4. VB.NETのAForge.NETで反転画像
- 5. クリック時に画像の色を反転させる[Android]
- 6. テーマに応じて画像の色を反転させる
- 7. WPFの画像反転
- 8. キネティックスで画像を反転しますか?
- 9. IOSアクセシビリティの色反転をプログラムで設定する
- 10. 画像の反転可能な回転
- 11. CSS反転トライアングル画像オーバーレイ
- 12. HTML5キャンバスで画像を反転/回転する方法
- 13. 画像でDivを反転するか、単に画像onClick = flip( 'ID NAME');
- 14. cocos2dで正方形の画像を回転または反転する
- 15. 斜めに画像を反転する
- 16. 反転した画像と回転した画像のサイズを変更する
- 17. 反転色
- 18. ショップサイト間で画像を転送できますか?
- 19. 反転ビットマップの色
- 20. PythonのRGB画像の反転ピクセル
- 21. iPhone:画像が反転する
- 22. アイコンの画像をJLabelから別の画像に転送できません
- 23. プログラムでBluetooth経由で画像を転送する
- 24. pypngでPython上の画像を水平に反転する
- 25. 画像を水平方向に反転
- 26. Androidベクター画像の反転方法(ネガティブ)
- 27. Cでbmp画像を反転するコードを理解する
- 28. Three.js:スプライトを反転できますか?
- 29. iterm2の配色をどのように反転できますか?
- 30. アンドロイドで画像をプログラムで回転して回転する方法は?
よく見える、私はそれを試してみよう – Brodie
素晴らしい、ありがとう – Brodie
このコードを提供していただきありがとうございます。このコードを網膜デバイスでどのように使用するには?例えば(retinaScale> 0.0){ } else { UIGraphicsBeginImageContext(image.size); } – elprl