2011-05-19 24 views
8

Hey. Tengo una imagen de 480 x 800 y me gustaría colocar esto en mi mapa de distribución. Intento dividir la imagen en una cuadrícula (6 x 10) y asignar a cada tesela esa parte específica de la imagen. Esencialmente, el mapa de mosaicos se verá como una imagen grande ya que cada mosaico tiene la parte relevante de la imagen adjunta. ¿Cuál es la mejor manera de hacer esto? He intentado examinar cada tesela y dibujarla en un mapa de bits de Writeable, pero todas las imágenes son iguales.Romper imagen en mosaicos

WriteableBitmap wb = new WriteableBitmap(80,80); 
Rect src= new Rect(x*Width,y*Height, 80, 80); 
Rect dest= new Rect(0, 0, 80, 80); 
wb.Blit(dest, mainWb, src); 
tile.SetImage(wb); 

(X e Y) son los justos los índices que se utilizan cuando se repite a través de la tilemap, 80 es la altura y la anchura del azulejo y mainWb es la gran imagen que quiero dividir. Gracias por cualquier ayuda.

edición: Código de bucle completo:

var mainImage = Application.GetResourceStream(new Uri("MainImage.jpg", UriKind.Relative)).Stream; 
        WriteableBitmap mainWb = new WriteableBitmap(480, 800);   

        mainWb.SetSource(mainImage); 
        for (int x = 0; x < 6; x++) 
        { 
         for (int y = 0; y < 12; y++) 
         { 
          Tile tile = new Tile(); 

          WriteableBitmap wb = new WriteableBitmap(80,80); 


Rect src = new Rect(x*Width,y*Height, 80, 80); 

         Rect dest = new Rect(0, 0, 80, 80); 

         wb.Blit(dest, mainWb, src); 
         tile.SetImage(wb);  

         Canvas.SetLeft(tile, x * WIDTH); 
         Canvas.SetTop(tile, y * HEIGHT); 


         LayoutRoot.Children.Add(tile); 
         ls.Add(tile); 
        } 
       } 

La clase Tile es un simple lienzo de 80x80 con un control Image llama img. El método SetImage anterior es la siguiente:

public void SetImage(WriteableBitmap wb) 
     {     
      img.Source = wb;      
     } 
+0

Ese código parece correcto. ¿Podrías publicar todo el ciclo? –

+0

@Olivier Payen - He agregado el ciclo completo. – Skoder

Respuesta

4

lo puede hacer con un buen truco - simplemente recortar la imagen usando cada vez un lienzo, y mover la imagen de modo que cada vez que otra pieza está mostrando:

 <Canvas Width="80" Height="80"> 
      <Canvas.Clip> 
       <RectangleGeometry Rect="0,0,80,80" /> 
      </Canvas.Clip> 
      <Image Source="your_image.png" 
    Canvas.Left="0" Canvas.Top="0" /> 
      <!-- or -80, -160, -240 etc.. --> 
     </Canvas> 
+0

He agregado más código a la pregunta original. ¿Debería hacer esto en el código que está detrás en el ciclo y modificar el método 'SetImage' para aceptar un parámetro' canvas'? – Skoder

+0

podrías hacer lo que me sugieras, pero lo más elegante es hacerlo con enlaces de datos. coloque el lienzo antes mencionado dentro de itemsControl.DataTemplate, y agréguelo a hacer una lista de objetos que contenga las coordenadas pertinentes. esa lista debe ser creada en código detrás. –

Cuestiones relacionadas