ImageMagick将图像加载到RAM中

ImageMagick将图像加载到RAM中,imagemagick,jpeg,image-manipulation,Imagemagick,Jpeg,Image Manipulation,我有一张JPG图片,为了使用模式识别,我想在上面执行一些操作。图片正在旋转,还有一些滤镜,如颜色反转、灰度,。。应用 节目是这样的 for(i=0;i<360;i++){ rotate(pic,i); foreach(filter as f){ f(pic); recognize(pic); } } >(i=0;i)由于您没有指定语言或操作系统,我将在Linux /OSX环境中演示如何在C++中使用MaGICK++来实现这一点: #include

我有一张JPG图片,为了使用模式识别,我想在上面执行一些操作。图片正在旋转,还有一些滤镜,如颜色反转、灰度,。。应用 节目是这样的

for(i=0;i<360;i++){
   rotate(pic,i);
   foreach(filter as f){
     f(pic);
     recognize(pic);
   }
}

<代码> >(i=0;i)由于您没有指定语言或操作系统,我将在Linux /OSX环境中演示如何在C++中使用MaGICK++来实现这一点:

#include <Magick++.h> 
#include <iostream> 
using namespace std; 
using namespace Magick; 
int main(int argc,char **argv) 
{ 
   InitializeMagick(*argv);

   // Create an image object
   Image image;

   // Read a file into image object 
   image.read( "input.gif" );

   // Crop the image to specified size (width, height, xOffset, yOffset)
   image.crop( Geometry(100,100, 0, 0) );

   // Repage the image to forget it was part of something bigger
   image.repage();

   // Write the image to a file 
   image.write( "result.gif" ); 

   return 0; 
}
您需要一个名为
input.gif
的图像才能读取,图像大小应大于100x100,因此请使用以下内容创建一个图像:

convert -size 256x256 xc:gray +noise random input.gif

您可以将映像写入
mpr:
,或将映像实例克隆到新结构。无论原始源在内存中的位置如何,您仍然需要为
循环复制第一个
中的数据。下面是一个C示例,它保存一个wand实例并克隆每个迭代

#包括
#包括
空心旋转(魔杖*魔杖,双度){
PixelWand*pwand=NewPixelWand();
像素设置颜色(pwand,“白色”);
MagickRotateImage(魔杖、魔杖、学位);
破坏像素棒(pwand);
}
void\u f(魔杖*魔杖,过滤器类型过滤器){
双x,y;
x=y=0.0;
MagickResampleImage(棒、x、y、过滤器);
}
无效识别(魔杖*魔杖){
// ???
}
int main(int argc,const char*argv[]{
MagickWandGenesis();
魔杖*魔杖,*复制魔杖;
魔杖=新魔杖();
MagickReadImage(魔杖,玫瑰:);
对于(int i=0;i<360;i++){
复制棒=CloneMagickWand(棒);
对于(过滤器类型f=UnfinedFilter;f
写入内存中的特定页,并可由用户定义的标签标识

MagickReadImage(魔杖,玫瑰:);
MagickWriteImage(魔杖,“mpr:original”);//将图像保存到“original”标签
对于(int i=0;i<360;i++){
copy_wand=NewMagickWand();
MagickReadImage(复印,mpr:原件);//从“原件”标签上读取图像
对于(过滤器类型f=UnfinedFilter;f
我能想到的最后一个选择是将图像像素数据复制到内存中,并在每次迭代时重新引用它。这允许一些性能改进,我考虑的是OpenMP,但你会失去很多辅助方法

MagickReadImage(魔杖,玫瑰:);
尺寸w=MagickGetImageWidth(魔杖);
尺寸=MagickGetImageHeight(魔杖);
尺寸数据长度=w*h*4;
char*data=malloc(数据长度);
MagickExportImagePixels(魔杖、0、0、w、h、“RGBA”、CharPixel(void*)数据);
对于(int i=0;i<360;i++){
长*复制数据=malloc(数据长度);
memcpy(复制数据、数据、数据长度);
convert -size 256x256 xc:gray +noise random input.gif