@qidiandasheng 2018-08-04T07:05:37.000000Z 字数 4449 阅读 2392

# 图像中的像素处理

技术

## 图像在内存中的存储

### python输出图像数据

import sysimport tensorflow as tffrom PIL import Image, ImageFilterimport numpy as npdef imageprepare(argv):    testImage=Image.open(argv).convert('L')    testImage = testImage.resize((6, 4))    test_input=np.array(testImage)    print(test_input)def main(argv):    """    Main function.    """    imvalue = imageprepare(argv)if __name__ == "__main__":    main(sys.argv[1])

[[254 255 254  97 255 248] [246 255  15 180 255 255] [252 227 227 246  44 252] [244 254 229 151 243 248]]

width = testImage.size[0]height = testImage.size[1]y = 0while y<height:    x = 0    while x<width:        print(test_input[y,x])        x += 1    y += 1

[[[254 254 254]  [255 255 255]  [254 254 254]  [ 97  97  97]  [255 255 255]  [248 248 248]] [[246 246 246]  [255 255 255]  [ 15  15  15]  [180 180 180]  [255 255 255]  [255 255 255]] [[252 252 252]  [227 227 227]  [227 227 227]  [246 246 246]  [ 44  44  44]  [252 252 252]] [[244 244 244]  [254 254 254]  [229 229 229]  [151 151 151]  [243 243 243]  [248 248 248]]]
width = testImage.size[0]height = testImage.size[1]y = 0while y<height:    x = 0    while x<width:        # 像素的3通道值        print(test_input[y,x])        print('R: ' + str(test_input[y,x,0]))        print('G: ' + str(test_input[y,x,1]))        print('B: ' + str(test_input[y,x,2]))        x += 1    y += 1

## 仿python图像处理库PIL

### python代码

def imageprepare(argv):    testImage=Image.open(argv).convert('RGBA')    testImage = testImage.resize((28, 28))    test_input=np.array(testImage)    print(test_input)    width = testImage.size[0]    height = testImage.size[1]    y = 0    while y<height:        x = 0        while x<width:            print(test_input[y,x])            # print('R: ' + str(test_input[y,x,0]))            x += 1        y += 1

### iOS代码

- (CGContextRef) newBitmapRGBA8ContextFromImage:(CGImageRef) image {    CGContextRef context = NULL;    CGColorSpaceRef colorSpace;    uint32_t *bitmapData;    size_t bitsPerPixel = 32;    size_t bitsPerComponent = 8;    size_t bytesPerPixel = bitsPerPixel / bitsPerComponent;    size_t width = CGImageGetWidth(image);    size_t height = CGImageGetHeight(image);    size_t bytesPerRow = width * bytesPerPixel;    size_t bufferLength = bytesPerRow * height;    colorSpace = CGColorSpaceCreateDeviceRGB();    if(!colorSpace) {        NSLog(@"Error allocating color space Gray\n");        return NULL;    }    // Allocate memory for image data    bitmapData = (uint32_t *)malloc(bufferLength);    if(!bitmapData) {        NSLog(@"Error allocating memory for bitmap\n");        CGColorSpaceRelease(colorSpace);        return NULL;    }    //Create bitmap context    context = CGBitmapContextCreate(bitmapData,                                    width,                                    height,                                    bitsPerComponent,                                    bytesPerRow,                                    colorSpace,                                    kCGImageAlphaPremultipliedLast);     if(!context) {        free(bitmapData);        NSLog(@"Bitmap context not created");    }    CGColorSpaceRelease(colorSpace);    return context;}

Bits per component ：一个像素中每个独立的颜色分量使用的 bit 数；Bits per pixel ：一个像素使用的总 bit 数；Bytes per row ：位图中的每一行使用的字节数。

### 源码

DSImageBitmaps这是我iOS源码的地址，其中包含了python的代码，我iOS里面的图片直接使用的是python裁剪过大小的图片，然后能发现数据的数据是一样的。

test.png (像素 20*20) test@2x.png(像素40*40) test@3x.png(像素 60*60)UIImage *image = [UIImageimageNamed:@"test.png"];image.size输出大小为（20，20);UIImage *image = [UIImage imageNamed:@"test@2x.png"];image.size输出大小为（20，20);UIImage *image = [UIImage imageNamed:@"test@3x.png"];image.size输出大小为（20，20);image.size输出的大小会自动识别图片是几倍的，如果是3倍的输出的结果就是像素除以3，2倍的像素除以2。

• 私有
• 公开
• 删除