0

float *配列からイメージを作成しようとしています。しかし、MagickConstituteImageは常にsegfaultsです。ここに関連するコードの概要は、(問題は、機能writeRawImageに発生する())である:MagickConstituteImage()Cでのセグメンテーション

#include <stdio.h> 
#include <stdlib.h> 
#include <wand/MagickWand.h> 

#define COLOR_MAX 65535.0 

typedef struct { 
     float   **px; 
     unsigned long width; 
     unsigned long height; 
} RawPixels; 

RawPixels getRawImage (char *path) 
{ 
    MagickWand  *mw; 
    MagickBooleanType status; 
    PixelIterator  *iter; 
    MagickPixelPacket pixel; 
    PixelWand   **pixels; 
    RawPixels   rp; 

    long   x; 
    long   y; 
    unsigned long width; 

    unsigned long count; 

    MagickWandGenesis(); 

    mw  = NewMagickWand(); 
    status = MagickReadImage(mw, path); 
    rp.px = NULL; 

    if (status == MagickFalse) { 
     return rp; 
    } 

    iter = NewPixelIterator(mw); 

    if (iter == (PixelIterator *) NULL) { 
     return rp; 
    } 

    rp.width = 0; 
    rp.height = (unsigned long) MagickGetImageHeight(mw); 
    count  = 0; 

    for (y = 0; y < rp.height; y++) { 
     pixels = PixelGetNextIteratorRow(iter, &width); 
     rp.width = (unsigned long) width; 

     if (rp.px == NULL) { 
      rp.px = malloc(sizeof(float *) * (width * rp.height + 1)); 
     } 

     if (pixels == (PixelWand **) NULL) { 
      break; 
     } 

     for (x = 0; x < (long) width; x++) { 
      count++; 
      rp.px[count - 1] = malloc(sizeof(float) * 3); 

      PixelGetMagickColor(pixels[x], &pixel); 

      rp.px[count - 1][0] = pixel.red/COLOR_MAX; 
      rp.px[count - 1][1] = pixel.green/COLOR_MAX; 
      rp.px[count - 1][2] = pixel.blue/COLOR_MAX; 
     } 
    } 

    rp.px[count] = NULL; 

    return rp; 
} 

void freeRawImage (RawPixels rp) 
{ 
    for (int i = 0; rp.px[i] != NULL; i++) { 
     free(rp.px[i]); 
    } 

    free(rp.px); 
} 

void writeRawImage (RawPixels rp, char *path) 
{ 
    // This function is the one that gives me a headache. 
    // Basically, I take float **rp.px, which has the following structure 
    // at this point: 
    // 
    // { 
    //  {float red, float green, float blue}, 
    //  {float red, float green, float blue}, 
    //  ... 
    // } 
    // 
    // Now, the documentation at https://www.imagemagick.org/api/magick-image.php#MagickConstituteImage 
    // says the following: 
    // 
    //  "The pixel data must be in scanline order top-to-bottom" 
    // 
    // So up until the call to MagickConstituteImage() I am trying 
    // to restructure the data and write it into float *scanline 
    // to satisfy that requirement. However, once I call 
    // MagickConstituteImage(), my program segfaults. 


    MagickWand *mw; 
    float   *scanline; 
    unsigned long pxcount; 

    for (pxcount = 0; rp.px[pxcount] != NULL; pxcount++); 
    pxcount *= 3; 
    scanline = malloc(sizeof(float) * pxcount); 

    pxcount = 0; 

    for (int i = 0; rp.px[i] != NULL; i++) { 
     for (int j = 0; j < 3; j++) { 
      scanline[pxcount++] = rp.px[i][j]; 
      printf("%f\n", scanline[pxcount - 1]); 
     } 
    } 

    // This function causes a segfault 
    MagickConstituteImage(mw, rp.width, rp.height, "RGB", FloatPixel, scanline); 

    free(scanline); 
} 

int main() 
{ 
     RawPixels rp; 

     if ((rp = getRawImage("samples/tiny-white.png")).px == NULL) { 
       fprintf(stderr, "ERROR: Failed to process image\n"); 
       return 1; 
     } 


     // Some image processing using raw pixels here 


     writeRawImage(rp, "previews/preview.jpg"); 

     freeRawImage(rp); 

     return 0; 
} 
+0

segfaultが表示されたら、最初に行うことはデバッガにドロップして、その問題がどこで発生したのか把握することです。誤って参照されているNULL値を参照してください。 – tadman

+0

あなたの答え、タッドマン、ありがとう、私はgdbを使用し、また、segfaultが私の答えで発生した - 問題はMagickWandのlibの間違った使い方だったと述べた。 – afdggfh

答えて

0

あなたはMagickConstituteImage(...)

でそれを使用する前に、機能 writeRawImage(...)

MagickWand *mw; 

を初期化していません

+0

すばやく正確な回答をいただきありがとうございます。あなたは私の一日を作った! – afdggfh

+0

そしてそれらが不思議に思う人のために:欠けている行は 'mw = NewMagickWand()'でした。 – afdggfh

関連する問題