00414 {
00415
00416
00417
imageTiles.
numInitialized = QMIN(files.size(),
MAX_TILES);
00418
00419
00420
00421
int* fileIndices =
new int[
imageTiles.
numInitialized];
00422
int* fileIndicesUsed =
new int[files.size()];
00423
int i;
00424
for(i=0; i<
imageTiles.
numInitialized; i++) { fileIndices[i] = -1; }
00425
for(i=0; i<((
int)files.size()); i++) { fileIndicesUsed[i] = 0; }
00426
00427
00428
for(i=0; i<
imageTiles.
numInitialized; i++)
00429 {
00430
double percentage = ((
double)rand()) / RAND_MAX;
00431
int fileNum = (
int) ( (files.size() - (i+1)) * percentage);
00432
00433
00434
int j = 0;
00435
int realFileNum = fileNum;
00436
while( fileNum >= 0)
00437 {
00438
if( fileIndicesUsed[j] == 1 ) { realFileNum++; }
00439
else { fileNum--; }
00440
00441 j++;
00442 }
00443
00444
00445 fileIndices[i] = realFileNum;
00446 fileIndicesUsed[realFileNum] = 1;
00447 }
00448
00449
00450
00451
int j;
00452
for( i=
imageTiles.
numInitialized-1; i>0; i--)
00453 {
00454
for( j=0; j<i; j++)
00455 {
00456
if( fileIndices[j] > fileIndices[j+1] )
00457 {
00458
int tmp = fileIndices[j+1];
00459 fileIndices[j+1] = fileIndices[j];
00460 fileIndices[j] = tmp;
00461 }
00462 }
00463 }
00464
00465
00466 QStringList chosenFiles;
00467 QStringList::iterator it;
00468
int curFileIndex = 0;
00469
int nextDesiredFileIndex = 0;
00470
for(it = files.begin(); it != files.end(); it++ )
00471 {
00472
if( curFileIndex == fileIndices[nextDesiredFileIndex] )
00473 {
00474 chosenFiles.append( *it );
00475 nextDesiredFileIndex++;
00476
00477
if( nextDesiredFileIndex >=
imageTiles.
numInitialized )
break;
00478 }
00479
00480 curFileIndex++;
00481 }
00482
00483
00484
00485
imageTiles.
numInitialized = QMIN((
int)chosenFiles.size(),
imageTiles.
numInitialized);
00486
00487
00488
00489
00490
delete fileIndices;
00491
delete fileIndicesUsed;
00492 fileIndices = NULL;
00493 fileIndicesUsed = NULL;
00494
00495
00496
00497
int tile = 0;
00498
00499
for(it = chosenFiles.begin(); it != chosenFiles.end(); it++ )
00500 {
00501
00502 QSize imageRes;
00503
getImageSize( *it, imageRes );
00504
00505
int intermediateWidth = -1;
00506
int intermediateHeight = -1;
00507
if( ((
double)imageRes.width()) / tileSize.width() > ((
double)imageRes.height()) / tileSize.height() )
00508 {
00509 intermediateHeight = tileSize.height();
00510 intermediateWidth = (
int) ( ((1.0*intermediateHeight*imageRes.width()) / imageRes.height()) + 0.5 );
00511 }
00512
else
00513 {
00514 intermediateWidth = tileSize.width();
00515 intermediateHeight = (
int) ( ((1.0*intermediateWidth*imageRes.height()) / imageRes.width()) + 0.5 );
00516 }
00517
00518 QImage scaledImage;
00519
scaleImage( *it, scaledImage, intermediateWidth, intermediateHeight );
00520
00521
00522
if( scaledImage.width() != tileSize.width() || scaledImage.height() != tileSize.height() )
00523 scaledImage = scaledImage.scale( tileSize, QImage::ScaleFree );
00524
00525
00526
imageTiles.
tiles[tile].
image.create( tileSize.width(), tileSize.height(), 32);
00527
imageTiles.
tiles[tile].
image.fill( qRgb(255,255,255) );
00528
00529
00530
int xOffset = (scaledImage.width() - tileSize.width())/2;
00531
int yOffset = (scaledImage.height() - tileSize.height())/2;
00532
int x, y;
00533 uchar* scaledScanLine;
00534 uchar* croppedScanLine;
00535 QRgb* scaledRgb;
00536 QRgb* croppedRgb;
00537
00538
double avgR=0;
double avgG=0;
double avgB=0;
00539
double avgS=0;
double avgL=0;
00540
00541
00542
00543
if( scaledImage.isNull() )
00544 {
00545 avgR = avgG = avgB = 255;
00546 avgS = avgL = 255;
00547 }
00548
else
00549 {
00550
for( y=0; y<tileSize.height(); y++)
00551 {
00552 scaledScanLine = scaledImage.scanLine(y + yOffset);
00553 croppedScanLine =
imageTiles.
tiles[tile].
image.scanLine(y);
00554
00555
for( x=0; x<tileSize.width(); x++)
00556 {
00557 scaledRgb = ((QRgb*) scaledScanLine) +x + xOffset;
00558 croppedRgb = ((QRgb*) croppedScanLine) + x;
00559
00560
00561 *croppedRgb = *scaledRgb;
00562
00563
00564 QColor color( *croppedRgb );
00565
00566 avgR += color.red();
00567 avgG += color.green();
00568 avgB += color.blue();
00569
00570
int h,s,l;
00571 color.getHsv( &h, &s, &l );
00572 avgS += s;
00573 avgL += l;
00574 }
00575 }
00576
00577
00578
int pixelCount = tileSize.width()*tileSize.height();
00579 avgR /= pixelCount;
00580 avgG /= pixelCount;
00581 avgB /= pixelCount;
00582 avgS /= pixelCount;
00583 avgL /= pixelCount;
00584 }
00585
00586
imageTiles.
tiles[tile].
avgColor = QColor( (
int)avgR, (
int)avgG, (
int)avgB );
00587
imageTiles.
tiles[tile].
avgS = (
int)avgS;
00588
imageTiles.
tiles[tile].
avgL = (
int)avgL;
00589
00590
00591 tile++;
00592 }
00593
00594 }