Hi, finally it works!!!
. The order of the color of the pixels was the inverse. Here's the final code:
void FotoEditorFotos
::paintRect(const QColor &color,
const QRect &rectAPintar
) {
int xMin = rectAPintar.x();
int xMax = xMin + rectAPintar.width() - 1;
int yMin = rectAPintar.y();
int yMax = yMin + rectAPintar.height() - 1;
if (!imatge.valid(xMin, yMin) || !imatge.valid(xMax, yMax)) return;
QRgb colorRgb = color.rgba();
quint8 *pixelsLiniaFoto;
quint8 color8 = 0;
quint8 colorVermell = 0;
quint8 colorVerd = 0;
quint8 colorBlau = 0;
quint8 colorAlpha = 0;
int bytesPixel = (imatge.depth()) >> 3;
if (bytesPixel == 1)
color8 = (imatge.isGrayscale()) ? qGray(colorRgb) : obtenirIndexColor(colorRgb);
else
{
colorVermell = qRed(colorRgb);
colorVerd = qGreen(colorRgb);
colorBlau = qBlue(colorRgb);
colorAlpha = qAlpha(colorRgb);
}
for (int j = yMin; j <= yMax; j++)
{
pixelsLiniaFoto = static_cast<quint8 *>(imatge.scanLine(j)) + (xMin * bytesPixel);
for (int i = xMin; i <= xMax; i++)
{
switch (bytesPixel)
{
case 1:
*(pixelsLiniaFoto++) = color8;
break;
case 4:
*(pixelsLiniaFoto++) = colorBlau;
*(pixelsLiniaFoto++) = colorVerd;
*(pixelsLiniaFoto++) = colorVermell;
*(pixelsLiniaFoto++) = colorAlpha;
break;
}
}
}
update();
}
void FotoEditorFotos::paintRect(const QColor &color, const QRect &rectAPintar)
{
int xMin = rectAPintar.x();
int xMax = xMin + rectAPintar.width() - 1;
int yMin = rectAPintar.y();
int yMax = yMin + rectAPintar.height() - 1;
if (!imatge.valid(xMin, yMin) || !imatge.valid(xMax, yMax)) return;
QRgb colorRgb = color.rgba();
quint8 *pixelsLiniaFoto;
quint8 color8 = 0;
quint8 colorVermell = 0;
quint8 colorVerd = 0;
quint8 colorBlau = 0;
quint8 colorAlpha = 0;
int bytesPixel = (imatge.depth()) >> 3;
if (bytesPixel == 1)
color8 = (imatge.isGrayscale()) ? qGray(colorRgb) : obtenirIndexColor(colorRgb);
else
{
colorVermell = qRed(colorRgb);
colorVerd = qGreen(colorRgb);
colorBlau = qBlue(colorRgb);
colorAlpha = qAlpha(colorRgb);
}
for (int j = yMin; j <= yMax; j++)
{
pixelsLiniaFoto = static_cast<quint8 *>(imatge.scanLine(j)) + (xMin * bytesPixel);
for (int i = xMin; i <= xMax; i++)
{
switch (bytesPixel)
{
case 1:
*(pixelsLiniaFoto++) = color8;
break;
case 4:
*(pixelsLiniaFoto++) = colorBlau;
*(pixelsLiniaFoto++) = colorVerd;
*(pixelsLiniaFoto++) = colorVermell;
*(pixelsLiniaFoto++) = colorAlpha;
break;
}
}
}
update();
}
To copy to clipboard, switch view to plain text mode
int FotoEditorFotos::obtenirIndexColor(const QRgb &colorRgb)
{
QVector<QRgb> taulaColor = imatge.colorTable();
int indexRgb = taulaColor.indexOf(colorRgb);
if (indexRgb < 0)
{
// Search for a similar color in the color table...
int n = taulaColor.count();
int verd = qGreen(colorRgb);
int vermell = qRed(colorRgb);
int blau = qBlue(colorRgb);
int alpha = qAlpha(colorRgb);
int diffMin = 1021; // 255*4 + 1
int diff;
QRgb rgb;
for (int i = 0; i < n; i++)
{
rgb = taulaColor[i];
diff = qAbs(qGreen(rgb) - verd) + qAbs(qRed(rgb) - vermell) + qAbs(qBlue(rgb) - blau) + qAbs(qAlpha(rgb) - alpha);
if (diff < diffMin)
{
diffMin = diff;
indexRgb = i;
}
}
}
return indexRgb;
}
int FotoEditorFotos::obtenirIndexColor(const QRgb &colorRgb)
{
QVector<QRgb> taulaColor = imatge.colorTable();
int indexRgb = taulaColor.indexOf(colorRgb);
if (indexRgb < 0)
{
// Search for a similar color in the color table...
int n = taulaColor.count();
int verd = qGreen(colorRgb);
int vermell = qRed(colorRgb);
int blau = qBlue(colorRgb);
int alpha = qAlpha(colorRgb);
int diffMin = 1021; // 255*4 + 1
int diff;
QRgb rgb;
for (int i = 0; i < n; i++)
{
rgb = taulaColor[i];
diff = qAbs(qGreen(rgb) - verd) + qAbs(qRed(rgb) - vermell) + qAbs(qBlue(rgb) - blau) + qAbs(qAlpha(rgb) - alpha);
if (diff < diffMin)
{
diffMin = diff;
indexRgb = i;
}
}
}
return indexRgb;
}
To copy to clipboard, switch view to plain text mode
Cesar I will try your last version. Thanks
Bookmarks