Beispiel #1
0
int load_ppm(char *filename, image *aPic)
{
  FILE *file;
  char buf[256];
  int width, height, depth;
  int i;
  byte *data;
  

  if (!(file = fopen(filename, "r")))
    return PICERR_CANTOPEN;

  fgets(buf, sizeof(buf), file);
  if (strcmp(buf, "P6\n"))
    return PICERR_BADFORMAT;

  fscanf(file, "%i %i\n%i\n", &width, &height, &depth);

  for (i = 1; (1 << i) < depth; i++);
  
  data = malloc(width * height * 3);
  fread(data, width * height * 3, 1, file);
  fclose(file);
  constructImage(aPic, COLORMASK, MESHED, width, height, i, data, NULL);
  free(data);
  
  return PICERR_NOERR;
}
void KisNodeModelTest::testSetImage()
{
    constructImage();
    m_shapeController->setImage(m_image);
    m_nodeModel->setDummiesFacade(m_shapeController, m_image, 0);
    new ModelTest(m_nodeModel, this);
}
void KisNodeModelTest::testRemoveAllNodes()
{
    constructImage();
    m_shapeController->setImage(m_image);
    m_nodeModel->setDummiesFacade(m_shapeController, m_image, 0);
    new ModelTest(m_nodeModel, this);

    m_image->removeNode(m_layer4);
    m_image->removeNode(m_layer3);
    m_image->removeNode(m_layer2);
    m_image->removeNode(m_layer1);
}
Beispiel #4
0
void KisNodeViewTest::testLayers()
{
    QDialog dlg;

    QFont font;
    font.setPointSizeF(8);
    dlg.setFont(font);

    KisNodeModel *model = new KisNodeModel(this);
    KisNodeView *view = new KisNodeView(&dlg);

    view->setModel(model);

    constructImage();
    addSelectionMasks();
    m_shapeController->setImage(m_image);

    model->setDummiesFacade(m_shapeController, m_image, m_shapeController, 0, 0);

    QVBoxLayout *layout = new QVBoxLayout(&dlg);
    KisColorFilterCombo *cb = new KisColorFilterCombo(&dlg);

    QSet<int> labels;
    for (int i = 0; i < 6; i++) {
        labels.insert(i);
    }
    cb->updateAvailableLabels(labels);

    QHBoxLayout *hbox = new QHBoxLayout(&dlg);
    hbox->addStretch(1);
    hbox->addWidget(cb);
    layout->addLayout(hbox);
    layout->addWidget(view);

    dlg.resize(280, 400);
    view->expandAll();

    dlg.exec();
}
Beispiel #5
0
int load_clip(char *filename, image *aPic)
{
  unsigned char buf[32];
  unsigned char cmap[256*3];
  int hascmap;
  int i, j, r, c, maxc=0;
  int width, height, bpp;
  unsigned char* img;
  unsigned char* p;
  FILE *file;


  curlen = 0;
  if (!(file = fopen(filename, "r")))
    return PICERR_CANTOPEN;

  if (!rd(file, buf, 17))
    return PICERR_BADFORMAT;
 
  if (buf[15] != 0)
    if (!rd(file, buf + 17, 2))
      return PICERR_BADFORMAT;
	
  if (buf[0] != 0x34 || buf[1] != 0x12)
    return PICERR_BADFORMAT;
 
  if (buf[12] != 'L' && buf[12] != 'C')
    fprintf(stderr, "I may not do the right thing...\n");
	
  hascmap = buf[13] & 4;
 
  width = buf[2] + buf[3] * 256;
  height = buf[4] + buf[5] * 256;
  bpp = buf[10];
  /* I'm not real sure about the bits-per-pixel, above */
 
  /* allocation equation depends on 8 | width (| = divides) */
  if (!(img = malloc(bytesleft = width * height * bpp / 8)))
    return PICERR_CANTALLOC;

  p = img;
  
  if (hascmap) {
    if (!rd(file, cmap, 256 * 3))
      return PICERR_BADFORMAT;
	
    for (i = 0; i < 256 * 3; i++)
      cmap[i] *= 4;
  }
 
  if (!rd(file, buf, 2))
    return PICERR_BADFORMAT;
 
  blocksleft = buf[0] + buf[1] * 256;
 
  while (brd(file, buf, 1)) {
    c = buf[0];
    if (c == spec) {
      brd(file, buf, 1);
      r = buf[0];
      if (r == 0) {
	brd(file, buf, 3);
	r = buf[1] * 256 + buf[0];
	c = buf[2];
      }
      else {
	brd(file, buf, 1);
	c = buf[0];
      }
    }
    else {
      r = 1;
    }

    while (r-- > 0) {
      if (--bytesleft < 0) {
	fprintf(stderr, "file too long, ignoring extra\n");
	goto dump;
      }
      *p++ = c;
    }
    if (c>maxc) maxc=c;
    if (bytesleft == 0)
      break;
  }
  if (!hascmap) {
    for (i = 0; i < 255 * 3; i++)
      cmap[i] = (255.0/maxc)*(i/3);
  }
 
 dump:
  for (i = 0; i < height / 2; i++)
    for (j = 0; j < width; j++) {
      c = img[i * width + j];
      img[i * width + j] = img[((height - 1) - i) * width + j];
      img[((height - 1) - i) * width + j] = c;
    }
 
  if (bpp == 8) {
    constructImage(aPic, COLORMASK | PALETTEMASK, PLANAR, width, height, bpp, img, cmap);
  }
  else {
    constructImage(aPic, COLORMASK, PLANAR, width, height, bpp, img, NULL);
  }
	
  free(img);
  
  return PICERR_NOERR;
}
Beispiel #6
0
void PhotoMosaic::run(QVector<QString> vec)
{

    QString subImageDir = vec.value(6);
    QString mainImagePath = vec.value(5);

    int mainWidth = vec.value(0).toInt();
    int mainHeight = vec.value(1).toInt();

    int subWidth = m_subImageWidth;
    int subHeight = m_subImageHeight;
    int numOfSubImages = vec.value(4).toInt();


    mainImagePath = resizeImage(mainImagePath,mainWidth,mainHeight);

    QDir directory(subImageDir);



    int precision = vec.value(7).toInt();

    FindAvgColorsInDirectory *avgDir = new FindAvgColorsInDirectory(directory, subWidth, subHeight, "jpeg",precision);
    FindAvgColorsInMain *avgMain = new FindAvgColorsInMain(mainImagePath,subWidth,subHeight,numOfSubImages,precision);

    //QFuture carries the result of a running thread.
    QFuture<void> avgDirThread =  QtConcurrent::run(avgDir,&FindAvgColorsInDirectory::calculateAllAverages);
    QFuture<void> avgMainThread = QtConcurrent::run(avgMain,&FindAvgColorsInMain::calculateAllAverages);


    qDebug() << "waiting to finish threads";
    //wait until both threads finished.
    avgMainThread.waitForFinished();
    avgDirThread.waitForFinished();


    RGB *dirStruct = avgDir->getAverageRGBArr();
    RGB *mainStruct = avgMain->getAverageRGBArr();


    //This is how it could be computed without using extra threads.
    //    FindAvgColorsInDirectory *avgDir = new FindAvgColorsInDirectory(directory, subWidth, subHeight, "jpeg",precision);
    //    avgDir->calculateAllAverages();
    //    RGB *dirStruct = avgDir->getAverageRGBArr();

    //    FindAvgColorsInMain *avgMain = new FindAvgColorsInMain(mainImagePath,subWidth,subHeight,numOfSubImages,precision);
    //    avgMain->calculateAllAverages();
    //    RGB *mainStruct = avgMain->getAverageRGBArr();


    QStringList *listRepeat = colorDifference(dirStruct, avgDir->getArraySize(), mainStruct, avgMain->getArraySize(),(precision * precision));


    QImage base;
    base.load(mainImagePath);
    QImage* img2 = new QImage(mainWidth,mainHeight, base.format());



    constructImage(listRepeat,img2, subImageDir);
    QString saveName = QString("%1(%2)%3")
            .arg("Photo Mosaic RGB ")
            .arg(QString::number(precision))
            .arg(".jpg");

    qDebug() << saveName;
    img2->save(saveName);

    //free unused memmory.
    delete listRepeat;
    delete img2;
    delete avgMain;
    delete avgDir;
}
Beispiel #7
0
static inline int readGifImage(FILE *giffile, image *aPic)
{
  unsigned char buf[9];
  int top, width, height;
  int local, interleaved;
  int localbits;
  int row;
  int *interleavetable = NULL;
  unsigned char *rasterfix = NULL;
  unsigned char *cmap = NULL, *raster = NULL;
  unsigned char colormap[256][3];
  int i, cbits;
  int err;


  fread(buf, 1, 9, giffile);
  top = buf[2] + (buf[3] << 8);
  width = buf[4] + (buf[5] << 8);
  height = buf[6] + (buf[7] << 8);
  local = buf[8] & 0x80;
  interleaved = buf[8] & 0x40;

  if (local) {
    localbits = (buf[8] & 0x07) + 1;
    fread(colormap, 3, 1 << localbits, giffile);
    cmap = (unsigned char *) colormap;
    cbits = 1 << localbits;
  }
  else if (global) {
    cmap = (unsigned char *) globalmap;
    cbits = 1 << globalbits;
  }
  else {
    fprintf(stderr, "No color map present.\n");
    return PICERR_BADFORMAT;
  }

  if (!(raster = malloc(width * height)))
    return PICERR_CANTALLOC;

  err = readGifRaster(width, height, raster, giffile);

  if (interleaved) {
    if (!(interleavetable = malloc(height * sizeof(int))))
      return PICERR_CANTALLOC;
    if (!(rasterfix = malloc(width * height)))
      return PICERR_CANTALLOC;

    row = 0;
    for (i = top; i < top + height; i += 8)
      interleavetable[i] = row++;
    for (i = top + 4; i < top + height; i += 8)
      interleavetable[i] = row++;
    for (i = top + 2; i < top + height; i += 4)
      interleavetable[i] = row++;
    for (i = top + 1; i < top + height; i += 2)
      interleavetable[i] = row++;

    for (row = top; row < top + height; row++)
      for (i = 0; i < width; i++)
	rasterfix[i + row * width] = raster[i + interleavetable[row] * width];

    free(raster);
    raster = rasterfix;
    free(interleavetable);
  }

  constructImage(aPic, COLORMASK | PALETTEMASK, PLANAR, width, height, 8, raster, cmap);
  free(raster);
  
  for (i = 0, row = 0; i < cbits; i++)
    if (cmap[i * 3] == cmap[i * 3 + 1] && cmap[i * 3] == cmap[i * 3 + 2])
      row++;

  if (row == cbits)
    makeMono(aPic);
  
  return err;
}