2017-03-14 1 views
0

J'ai essayé tout ce que j'ai trouvé pour sauver juste mon image sans frontières sans succès. Mon image est 124x126, donc quand l'image est sauvegardée c'est toujours avec des bordures et une nouvelle taille 300x300, Si j'utilise un autre programme pour sélectionner seulement mon image c'est 208x209. donc je ne sais pas pourquoi mon image est mise à l'échelle et pourquoi il est toujours 300x300, Si je change la taille de vtkRenderWindow à 124x126 les frontières sont toujours là et mon image est réduite. Ma question est de savoir comment je peux enregistrer mon image de 124x126 sans frontières?screenshot image de vtkRenderWindow sans frontières

 mapper.SetInputConnection(polyDataReader.GetOutputPort()); 
     vtkActor actor = new vtkActor(); 
     actor.SetMapper(mapper); 
     actor.GetBounds(bounds); 
     System.out.println("actor: " + bounds[1] + " x " + bounds[3]); // 124x126 (everything's ok) 

     //Create a renderer, render window, and interactor 
     vtkRenderer renderer = new vtkRenderer(); 

     vtkRenderWindow renderWindow = new vtkRenderWindow(); 
     renderWindow.BordersOff();  // the borders are still there  
     renderWindow.AddRenderer(renderer); 

     vtkRenderWindowInteractor renderWindowInteractor = new vtkRenderWindowInteractor(); 
     renderWindowInteractor.SetRenderWindow(renderWindow); 


     //Add the actor to the scene 
     renderer.AddActor(actor); 
     renderer.SetBackground(0, 0, 0); 


     //Render and interact 
     renderWindow.Render(); 

     //screenshot code: 
     vtkWindowToImageFilter w2if = new vtkWindowToImageFilter(); 
     w2if.SetInput(renderWindow); 
     w2if.Update(); 

     vtkPNGWriter writer = new vtkPNGWriter(); 
     writer.SetFileName("out.png");  //my image with borders 300x300 !!!!?? 
     writer.SetInputData(w2if.GetOutput()); 
     writer.Write(); 

image saved with borders

ps: désolé pour mon anglais

Répondre

0

Il est parce que votre RenderWindow a la taille par défaut de 300x300. Ce que vous devez réaliser est que la polydata est rendue dans une scène 3D, et ce que vous appelez "frontières" est l'arrière-plan, dont la quantité dépend du niveau de zoom, c'est-à-dire sur la position de votre caméra. Pour obtenir ce que vous voulez, vous devez faire deux choses:

  • Redimensionner RenderWindow à taille d'image désirée:

renderWindow.SetSize(bounds[1], bounds[3]);

  • caméra Repositionner afin que l'acteur remplit complètement la fenêtre. Essayez

renderer.GetActiveCamera().SetParallelScale(1); // we want parallel projection renderer.GetActiveCamera().SetParallelScale(0.5 * (bounds[3] - bounds[2])); // zoom

Les limites de zoom peut être de 0,5 * (limites [1] - limites [0]), pas exactement de quel côté du rectangle, il devrait être.

Hope this helps,

Miro

+0

Merci Je ne sais pas pourquoi votre code ne fonctionne pas pour moi, mais j'ai essayé celui-ci et cela fonctionne, mais je ne sais pas comment calculer la valeur ** 245 ** de mes valeurs hier je la mets car c'est celle qui me donne le bon zoom. 'camera.SetPosition ((bounds [1] -bounds [0]) * 0,5, (bounds [3] -bounds [2]) * 0,5, 245,0); camera.SetFocalPoint ((bounds [1] -bounds [0]) * 0.5, (bounds [3] -bounds [2]) * 0.5, 0.0); ' –

+0

Que veux-tu dire par" ça ne marche pas pour moi " "? Vous voulez certainement placer la caméra au milieu des limites, il devrait donc être (bornes [0] + limites [1]) * 0.5 dans votre code, plus pas moins. Le 245 est la distance de la caméra et il est un facteur de l'angle de vue et de la taille de l'objet. Si vous dessinez sur le papier, avec un peu de trigonométrie, vous pouvez le comprendre. Mais si vous ne disposez pas d'un système de projection parallèle, votre image risque de souffrir de déformation de la projection, un peu comme si les voies ferrées convergeaient sur une peinture, même si elles sont parallèles dans la réalité. – mirni