2012-02-16 5 views
0

新しい画像を作成するコードを記述しました。私の背景イメージには黒い領域があり、forループが黒のピクセルになると、新しいイメージに青のイメージが描画されます。それ以外の場合は元のピクセルが描画されます。私はこれを行うことができると思ったが、プログラムは実行し続ける。新しい画像で元のピクセルが黒だった場合、Qtは青のピクセルを描画します

QApplication a(argc, argv); 
int c, m, y, k, al; 
QColor color; 
QColor drawColor; 
QImage background; 
QImage world(1500, 768, QImage::Format_RGB32); 
QSize sizeImage; 
int height, width; 
background.load("Background.jpg"); 
world.fill(1); 
QPainter painter(&background); 
sizeImage = background.size(); 
width = sizeImage.width(); 
height = sizeImage.height(); 

for(int i = 0; i < height; i++) 
{ 
    for(int z = 0; z < width; z++) 
    { 
     color = QColor::fromRgb (background.pixel(i,z)); 
     color.getCmyk(&c,&m,&y,&k,&al); 

     if(c == 0 && m == 0 && y == 0 && k == 0) //then we have black as color and then we draw the color blue 
     { 
      drawColor.setBlue(255); 
      painter.setPen(drawColor); 
      painter.drawPoint(i,z); 
     } 
    } 

} 


//adding new image to the graphicsScene 
QGraphicsPixmapItem item(QPixmap::fromImage(background)); 
QGraphicsScene* scene = new QGraphicsScene; 
scene->addItem(&item); 

QGraphicsView view(scene); 
view.show(); 

私のループは間違っているのですか、それとも私の画家ですか?それはQImage :: pixel:座標(292,981)が範囲外ですが、soo多くのピクセルでは、使用するのに十分速くありません。

+0

「プログラムは実行し続けています」とはどういう意味ですか?それは決してforループから出ることはありませんか?あなたは期待した結果を得られないのですか? – Bart

+0

ループが非常に遅いのは単純ですか?そのような個々のピクセルを読み書きすることによって大きなイメージを変換することは少し遅れていくだろうと私には思われます! – Robinson

+0

その後、より良いアプローチは何ですか?青のピクセルだけを再描画すると思っていたかもしれませんが、イメージをループする方法はわかりません。 – user1007522

答えて

2

コメントに記載されているように、ピクセルを1つずつ描画することは非常に遅くなる可能性があります。ピクセルごとのアクセスでさえ、quite slowになることができます。例えば。以下は、おそらく高速ですが、それでも非常によくない:

const QRgb black = 0; 
    const QRgb blue = 255; 
    for(int y = 0; y < height; y++) { 
    for(int x = 0; x < width; x++) { 
     if (background.pixel(x,y) == black) { 
     background.SetPixel(blue); 
     } 
    } 
    } 

迅速に解決策をscanline()を経由して直接bitoperationsを必要とします。最初にconvertToFormat()と呼ぶことができます。そのため、可能な異なるスキャンライン形式に対処する必要はありません。

クリエイティブハックとして、createMaskFromColorを呼び出して、すべての黒色ピクセルを透明にし、青色の背景にペイントします。

+0

ありがとう、これは非常に高速ですが、コードは何も青色に変わらない。 – user1007522

+0

さて、私は実際の絵画部分を残しました。これは単に 'QImageの背景 'を変更します。引き続き 'painter.drawImage()'コールが必要です。 (ああ、それは黒については非常に厄介です、濃い濃い灰色は黒ではありません)。 – MSalters

+0

Aoké、全体的なループの後で、私はイメージを再び描画する必要がありますか、またはifテストで意味しますか? – user1007522

関連する問題