Mam funkci, ktera mi obrazek vrati jako
uint8 *pImage;
Jestli to spravne chapu, tak je to nejake pole s uint8 hodnotami. RGB za sebou, protoze tam je jeste jakasi konverzni funkce (kterou nepouzivam, nepotrebuji), ktera cte data jako (y * width + x) * components.
Potreboval bych to prevest na PPM pixmapu, kterou zobrazuji napriklad jako
QString path1 = "C:\\QT-projekty\\test-proj-j\\jpgcode\\smiley.jpg";
QPixmap pixmap(path1);
ui->label->setPixmap(pixmap);
Pixmapu je tez mozne nacist pomoci
QByteArray z;
pixmap.loadFromData(z);
pixmapa je prave ve formatu PNM, ktery by melo byt snadne z toho pImage typu RGB dostat. PPM vypada tak, ze k RGB se na zacatek pripoji text
P6
200 200
255
P asi oznacuje PPM, 6 je pocet komponent, obvykle 6, pro grayscale 5, ale asi by tam slo pouzit i 3.
Pak je sirka vyska obrazku.
255 na konci.
Ted bych potreboval tento spojit retezec + pImage do neceho, treba pImage2 a zkonvertovat to na format pixmap, abych to mohl vykreslit na obrazovku a videt, ze ta funkce generujici pImage skutecne udela obrazek.
Problem je, ze jako zacatecnik se uz snazim druhej den poskladat nejak ten string v QT a prevod formatu se mi uz nedari vubec. To Qt cpp funguje fakt nejak divne. Bud mi to pise errory, coz nejak opravim, a nebo mi pri spusteni aplikace aplikace hapne a nenapise proc. Takze pak nechapu, co se deje.
Pomohl by mi nekdo napsat tu jednoduchou prevodni funkci? Nektere veci se mi asi podarilo vyresit, ale neumim to propojit.
--- to jsou jakesi fragmenty kodu, jak asi by to mohlo vypadat
--- ake proste nechapu, jak s tim to cesko pracuje, jak pridat na zacatek pole typu uint8 nejaky Qstring;
char result[]="";
int c;
int w;
int h;
c = decoder.IsColor() ? 6 : 5;
w = decoder.GetWidth();
h = decoder.GetHeight();
//result = "P"+((char*)c)+"\n"+((char*)w)+" "+((char*)h)+"\n255\n";
strcpy(result,"");
strcat(result,"P");
strcat(result,QString::number(c).toLocal8Bit());
strcat(result,"\n");
strcat(result,QString::number(w).toLocal8Bit());
strcat(result," ");
strcat(result,QString::number(h).toLocal8Bit());
strcat(result,"\n255\n");
strcat(result,QString::number(decoder.GetImageSize()).toLocal8Bit());
---
uchar image2[] = "";
uchar *pImage2 = image2;
//image2[] = "";
//pImage2 = &image2;
//pImage2 = image1;
int pos,z,x,y;
z = 0;
for (y = 0; y < height; ++y)
{
for (x = 0; x < width; ++x)
{
pos = z * comps;
++z;
// pImage +=pos;
//pImage2+=pos;
//pImage2[0] = (uchar)pImage[0];
//pImage2[1] = (uchar)pImage[1];
//pImage2[2] = (uchar)pImage[2];
}
}
--- tohle je original funkce, ktera s tim "pImage" pracuje jako
--- "const uint8 *pSrc", ale konvertuje to do "int a[3];" (to je to "int* pDst")
static void get_pixel(int* pDst, const uint8 *pSrc, int luma_only, int num_comps)
{
int r, g, b;
if (num_comps == 1)
{
r = g = b = pSrc[0];
}
else if (luma_only)
{
const int YR = 19595, YG = 38470, YB = 7471;
r = g = b = (pSrc[0] * YR + pSrc[1] * YG + pSrc[2] * YB + 32768) / 65536;
}
else
{
r = pSrc[0]; g = pSrc[1]; b = pSrc[2];
}
pDst[0] = r; pDst[1] = g; pDst[2] = b;
}