试图用文本掩盖 APNG 背景
Trying to mask APNG background with text
我正在 Pebble example 使用 APNG 并尝试用透明文本对其进行屏蔽,因此位图将只显示文本,但无论我尝试哪种 mask/composite 模式,都会显示位图为黑白(原动画是彩色的,如果我不画文字就显示彩色)
这是我在回调 SP 中用于绘制文本层的示例代码:
//creating background and text
graphics_context_set_fill_color(ctx, GColorBlack);
graphics_fill_rect(ctx, GRect(0, 0, 144, 168), 0, GCornerNone);
graphics_context_set_text_color(ctx, GColorWhite);
graphics_draw_text(ctx, "08:39", fonts_get_system_font(FONT_KEY_ROBOTO_BOLD_SUBSET_49), GRect(0,50,144,118), GTextOverflowModeFill, GTextAlignmentCenter, NULL);
//drawing bitmap (extracted from bitmap_sequence elsewhere)
graphics_context_set_compositing_mode(ctx, GCompOpClear);
graphics_draw_bitmap_in_rect(ctx, s_bitmap, GRect(0,0,144,168));
知道如何显示实际颜色位图吗?
好的,我终于成功了,但不确定这是否是最好的方法。我基本上捕获当前层的帧缓冲区,然后遍历每个像素,逐字节复制源位图,但仅在遇到白色像素时:
GBitmap *fb = graphics_capture_frame_buffer_format(ctx, GBitmapFormat8Bit);
uint8_t *fb_data = gbitmap_get_data(fb);
uint8_t *anim_data = gbitmap_get_data(s_bitmap);
for (int i=0; i < 144*168; i++) {
if (fb_data[i] == 255) {
fb_data[i] = anim_data[i];
}
}
这个can be optimized也是。
我正在 Pebble example 使用 APNG 并尝试用透明文本对其进行屏蔽,因此位图将只显示文本,但无论我尝试哪种 mask/composite 模式,都会显示位图为黑白(原动画是彩色的,如果我不画文字就显示彩色)
这是我在回调 SP 中用于绘制文本层的示例代码:
//creating background and text
graphics_context_set_fill_color(ctx, GColorBlack);
graphics_fill_rect(ctx, GRect(0, 0, 144, 168), 0, GCornerNone);
graphics_context_set_text_color(ctx, GColorWhite);
graphics_draw_text(ctx, "08:39", fonts_get_system_font(FONT_KEY_ROBOTO_BOLD_SUBSET_49), GRect(0,50,144,118), GTextOverflowModeFill, GTextAlignmentCenter, NULL);
//drawing bitmap (extracted from bitmap_sequence elsewhere)
graphics_context_set_compositing_mode(ctx, GCompOpClear);
graphics_draw_bitmap_in_rect(ctx, s_bitmap, GRect(0,0,144,168));
知道如何显示实际颜色位图吗?
好的,我终于成功了,但不确定这是否是最好的方法。我基本上捕获当前层的帧缓冲区,然后遍历每个像素,逐字节复制源位图,但仅在遇到白色像素时:
GBitmap *fb = graphics_capture_frame_buffer_format(ctx, GBitmapFormat8Bit);
uint8_t *fb_data = gbitmap_get_data(fb);
uint8_t *anim_data = gbitmap_get_data(s_bitmap);
for (int i=0; i < 144*168; i++) {
if (fb_data[i] == 255) {
fb_data[i] = anim_data[i];
}
}
这个can be optimized也是。