2014-03-12 48 views
0

16 진수 정수로 저장된 QImages를 이진 파일로 구성하려고합니다. 난 괜찮아에서 데이터를로드 할 수 있어요,하지만 난 QImage :: loadFromData (QBytearray 바) 기능을 사용하면 내 프로그램은 다음과 같이 (false를 반환) 실패 QBytearray에서 QImage 만들기

QBytearray frame; 
QImage pic = QImage(256, 256, QImage::Format_RGB888); 

for(int i = 0; i < height; i++) { 
    for(int j = 0; j < width; j++) { 
     // Access value of pixel at each location 
     datum = store[i][j]; 

     for(int c = 0; c < 3; c++) { 
      // Calculate colour at given pixel 
      col = (255.0f * ((float)datum - (float)min)/((float)(max - min))); 
      // Assign colour value to the pixel 
      frame[c+3*j+3*i*width] = ((unsigned char)col); 
     } 
    } 
} 

pic.loadFromData(frame); 

나는 내가 가진 자바 코드에서이 용도 변경 이전에 작성하는 (동일한 데이터에서) 의도 한대로 완벽하게 작동 :

BufferedImage image = = new BufferedImage(256, 256, BufferedImage.TYPE_3BYTE_BGR); 

byte[] data = image.getRaster().getDataBuffer(); 

for (j=0; j<height; j++) { 
    for (i=0; i<width; i++) { 
     //Find value of the pixels at the location 
     datum=data[j][i]; 
     for (c=0; c<3; c++) { 
      //Calculate the colour at the given pixel 
      col=(255.0f*((float)datum-(float)min)/((float)(max-min))); 
      //Assign the colour value to the pixel 
      data[c+3*i+3*j*width] = (byte)col; 
     } 
    } 
} 

아무도 내가이 잘못된납니다 위치를 확인하는 데 도움이 수 있습니까? 나는 며칠 동안 곤란을 겪었고 모든 아이디어가 없습니다.

+0

'store'를 하드 코딩 된 미리 결정된 값으로 설정해 보셨습니까? 그렇다면 결과는 무엇입니까? 그렇지 않다면, 당신은 그것을 할 수 있고 우리에게 결과를 줄 수 있습니까? 당신이 그것을 완성 할 때'틀'은 무엇입니까? – MirroredFate

+0

@MirroredFate 이미지가 256x256 인 것을 감안할 때 그럴 수는 없으므로 이미지의 값을 하드 코딩하는 데 약간 시간이 걸립니다. 그리고 프레임 제작을 마치면 프레임이란 무엇을 의미합니까? 크기? – Strongo

+0

나를 당황하게 한 한 가지는 Bytearray를 파일 (직접 작동)에서로드 된 별도의 이미지에서 덤핑하면 QByteArray 2562 요소를 제공한다는 것입니다. 구성하는 요소는 196609 개 요소입니다. 이 (거대한) 크기 불일치는 문제의 적어도 일부라고 생각하지만 데이터 형식의 차이가 둘 사이에 어떤 차이가 있는지 알 수 없습니다. 196609 바이트 배열이 Java 구현에서 잘 작동했기 때문에 같은 크기의 이미지에 대한 C++ 바이트 배열이 왜 그렇게 작을 지 알 수 없습니다. – Strongo

답변

0

좋아, 당신이 QImage details을 읽은 후, 개별 픽셀에 대한 RGB 값을 설정하려고 사실에 있다고 가정, 난 당신이 다음과 같은 사용하여 수행 할 수 있습니다 참조 :

value = qRgb(189, 149, 39); // 0xffbd9527 
image.setPixel(1, 1, value); 

그래서, 뭔가 같은 :

QImage pic = QImage(256, 256, QImage::Format_RGB888); 
QRgb value; 
int r,b,g; 

for(int i = 0; i < height; i++) { 
    for(int j = 0; j < width; j++) { 
     // Access value of pixel at each location 
     datum = store[i][j]; 
     //I get really confused what is going on here... you don't seem to be actually using `c` for the calculation? 
     for(int c = 0; c < 3; c++) { //let's just pretend you set the ints r,b,g in here somewhere 
      // Calculate colour at given pixel 
      col = (255.0f * ((float)datum - (float)min)/((float)(max - min))); 
     } 
     // Assign colour value to the pixel 
     value = qRgb(r, g, b); 
     pic.setPixel(i, j, value); 
    } 
} 
+0

정말 완벽하게 작동했습니다. 정말 고마워요, 며칠 동안 나를 가중 시켰습니다.마침내 해결책을 찾은 것이 얼마나 기쁜지 잘 모를 것입니다. – Strongo

+0

@Strongo 다행입니다! – MirroredFate