He cargado un objeto CBitmap desde un ID de recurso, y ahora quiero escalarlo al 50% de su tamaño en cada dimensión. ¿Cómo puedo ir sobre esto?¿Cómo se escala un objeto CBitmap?
5
A
Respuesta
5
- Seleccione su CBitmap obj en un memDC A (usando CDC :: SelectObject())
- Crear un nuevo CBitmap con tamaño deseado y seleccionarlo en otro MemDC B
- Uso CDC :: StretchBlt (. ..) para estirar bmp en MemDC a en MemDC B
- cancelar la selección de objetos CBitmap (mediante la selección de lo que se volvió de las llamadas anteriores a SelectObject)
- utilizar su nuevo CBitmap
0
Aquí hay una implementación resuelta de la respuesta de @Smashery.
Lo uso para escalar basado en DPI, pero debe ser fácil de adaptar a escalas arbitrarias.
std::shared_ptr<CBitmap> AppHiDpiScaleBitmap (CBitmap &bmp)
{
BITMAP bm = { 0 };
bmp.GetBitmap (&bm);
auto size = CSize (bm.bmWidth, bm.bmHeight);
CWindowDC screenCDC (NULL);
auto dpiX = screenCDC.GetDeviceCaps (LOGPIXELSX);
auto dpiY = screenCDC.GetDeviceCaps (LOGPIXELSY);
auto hiSize = CSize ((dpiX * size.cx)/96, (dpiY * size.cy)/96);
std::shared_ptr<CBitmap> res (new CBitmap());
res->CreateCompatibleBitmap (&screenCDC, hiSize.cx, hiSize.cy);
CDC srcCompatCDC;
srcCompatCDC.CreateCompatibleDC (&screenCDC);
CDC destCompatCDC;
destCompatCDC.CreateCompatibleDC (&screenCDC);
CMemDC srcDC (srcCompatCDC, CRect (CPoint(), size));
auto oldSrcBmp = srcDC.GetDC().SelectObject (&bmp);
CMemDC destDC (destCompatCDC, CRect(CPoint(), hiSize));
auto oldDestBmp = destDC.GetDC().SelectObject (res.get());
destDC.GetDC().StretchBlt (0, 0, hiSize.cx, hiSize.cy, &srcDC.GetDC(), 0, 0, size.cx, size.cy, SRCCOPY);
srcDC.GetDC().SelectObject (oldSrcBmp);
destDC.GetDC().SelectObject (oldDestBmp);
return res;
}
Cuestiones relacionadas
- 1. Cargar un CBitmap dinámicamente
- 2. Cargar un recurso png en un CBitMap
- 3. array [byte] a HBITMAP o CBitmap
- 4. ¿Cómo se produce un eje a escala exponencial?
- 5. ¿Cómo puedo medir cómo se escala el código multiproceso (aceleración)?
- 6. ¿Cómo se imprime un objeto, llamado * (asterisco)?
- 7. ¿Cómo se puede clonar un objeto WPF?
- 8. ¿Cómo se elimina un objeto ActiveRecord?
- 9. ¿Se puede eliminar un objeto? ¿Cómo?
- 10. ¿Qué significa decir que un marco "se escala bien"?
- 11. No se puede asignar un objeto a un objeto volátil
- 12. ¿Cómo se establecen diferentes límites de escala para diferentes facetas?
- 13. Escala de un modelo de dominio enriquecido
- 14. ¿Cómo se asigna un "int" a un objeto?
- 15. ¿Cómo se filtra un campo en un objeto relacionado?
- 16. ¿Cómo se obtiene un valor específico de un objeto System.Data.DataTable?
- 17. Escala Drupal
- 18. ¿Por qué esta svg se recorta y no se escala?
- 19. ¿Cómo encadenar las animaciones de escala con un iPhone UIImageView?
- 20. Escala de transformación D3 y traducir
- 21. Escala Tamaño del texto en un TextView
- 22. ¿Cómo se convierte un objeto time.struct_time de Python en un objeto datetime?
- 23. ¿Cómo se ajusta/controla la escala en un treemap (usando la biblioteca 'portfolio') en R?
- 24. UISegmentedControl escala de imagen
- 25. ¿Se construye un objeto si se lanza un inicializador?
- 26. Linear X escala logarítmica
- 27. Escala WebView en Cocoa
- 28. ¿Cómo convierto un objeto String en un objeto Hash?
- 29. ¿Cómo recojo un objeto?
- 30. cómo agregar un eventListener a un objeto en JavaScript que se activará cuando se manipule el objeto?
No estoy seguro de cómo usar todas esas funciones; en qué orden, utilizando qué versión de la función, y cómo se puede utilizar un CDC para un CBitmap. ¿Podría proporcionar algún código? – Smashery
¿Y cuál de los códigos de operación de trama a utilizar? http://msdn.microsoft.com/en-us/library/dd183370(v=VS.85).aspx – Smashery
@Smashery - SRCCOPY sería correcto – SysAdmin