我在 linux 中有一个使用Berkeley_sockets的服务器,我创建了一个与 iPod 客户端的 TCP 连接。我有一个IplImage* img;
要从服务器发送到 iPod。我使用write(socket,/*DATA*/,43200);
命令,我尝试发送的数据是reinterpret_cast<char*>(img)
:img
和img->imageData
。所有这些选择实际上都发送任何类型的数据。
在 iPod 端,我以这种方式接收数据(正如我在 SO 中看到的那样。不要介意复杂的东西,它只是用于从单个图像接收所有数据。):
bytesRead = [iStream read: (char*)[buffer mutableBytes] + totalBytesRead maxLength: 43200 - totalBytesRead];
收到整个图像后,我有这个:
[buffer setLength: 43200];
NSData *imagem = [NSData dataWithBytes:buffer length:43200];
UIImage *final= [self UIImageFromIplImage:imagem];
现在..我知道我可以让 openCV 在 iPod 上工作,但我找不到关于如何让它工作的简单解释,所以我使用了这个网页的第二个代码并对其进行了调整,因为我知道所有规格我的图像(例如,我设置了CGImageCreate()
函数中的所有变量。):
- (UIImage *)UIImageFromIplImage:(NSData *)image {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
// Allocating the buffer for CGImage
NSData *data = [NSData dataWithBytes:image length:43200];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
// Creating CGImage from chunk of IplImage
size_t width = 240;
size_t height = 180;
size_t depth = 8; //bitsPerComponent
size_t depthXnChannels = 8; //bitsPerPixel
size_t widthStep = 240; //bytesPerRow
CGImageRef imageRef = CGImageCreate(width, height, depth, depthXnChannels, widthStep, colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,provider, NULL, false, kCGRenderingIntentDefault);
// Getting UIImage from CGImage
UIImage *ret = [UIImage imageWithCGImage:imageRef];
lolView.image = ret;
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return ret;
}
问题:当我显示图像时,我得到它完全奇怪和“随机”,即使发送的图像总是相同的。我真的不知道怎么了。。
PS:TCP 连接与其他数据(如数字或单词)一起工作正常。并且图像是灰度的。
感谢所有的帮助。