cv::Mat image = cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255;为什么生成蓝色的,不是白底的怎么改为白色的
时间: 2024-02-28 20:54:59 浏览: 82
`cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255` 的作用是生成一个每个像素值都为 255 的 `CV_8UC3` 格式的图像,也就是一个全白图像。但是在 `putText` 函数中,`cv::Scalar(0, 0, 0)` 表示字体颜色为黑色。因此,在生成图像时会将黑色字体放在全白图像上,生成的图像会是黑底白字的。
要生成白底黑字的图像,只需将 `cv::Scalar(0, 0, 0)` 更改为 `cv::Scalar(255, 255, 255)`,表示字体颜色为白色即可。最终的代码如下:
```
cv::Mat image = cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255;
int tmp = 57;
for(int i = 0; i < 4; i++) {
cv::putText(image, nativeText, cv::Point((int)x, (int)y + i * 57), cv::FONT_HERSHEY_SIMPLEX, size,
cv::Scalar(255, 255, 255), 3, cv::LINE_AA,false);
}
```
相关问题
用c/c++编程实现 DDA 直线生成算法 用c/c++编程实现 Bresenham 直线生成算法 要求 : (1) 自定义直线段起始点和终点坐标; (2) 包含各种斜率的情况:|m|<1、|m|>=1 等; (3) 为突出显示效果,采用 2x2 的像素块表示一个像素。
在C/C++中,我们可以分别使用Double Dithering Algorithm (DDA)和Bresenham's Algorithm来生成屏幕上的直线。这两者都是二进制空间直纹算法,用于在离散的像素网格上近似连续的直线。
**DDA算法**:
DDA算法适用于斜率较小的直线,因为它的精度依赖于步长比例。首先,你需要定义一个结构体来存储起点(x1, y1)和终点(x2, y2),然后编写函数:
```cpp
struct Point {
int x, y;
};
void dda(double x1, double y1, double x2, double y2, int stepSize, int pixelWidth, int pixelHeight) {
Point start = {round(x1), round(y1)};
Point end = {round(x2), round(y2)};
for (int i = start.y; i <= end.y; i += stepSize) {
for (int j = start.x; j <= end.x; j += stepSize) {
// 2x2像素块处理
int x = j * pixelWidth, y = i * pixelHeight;
draw_pixel(x, y); // 画出像素
}
}
}
```
**Bresenham's Algorithm**:
Bresenham's算法对于斜率较大的情况效率更高,因为它使用了整数计算来减少误差。同样定义结构体并编写函数:
```cpp
void bresenham(int x1, int y1, int x2, int y2, int pixelWidth, int pixelHeight) {
int dx = abs(x2 - x1);
int dy = abs(y2 - y1);
int steep = dy > dx ? 1 : 0;
if (steep) {
swap(x1, y1);
swap(x2, y2);
}
int err = dx / 2;
int e2 = 2 * dy - dx;
for (int i = x1; i <= x2; ++i) {
if (steep) {
draw_pixel(y1 * pixelHeight, i * pixelWidth);
} else {
draw_pixel(i * pixelWidth, y1 * pixelHeight);
}
if (e2 >= 0) {
y1 += dy;
err -= e2;
}
e2 += 2 * dx;
}
}
```
在这两个函数中,`draw_pixel()`是你需要自定义的一个函数,用于实际在屏幕上绘制2x2像素块代表的像素。
wpf Teigha ImageDef 示例
对于 WPF 中使用 Teigha ImageDef 的示例,以下是一个简单的代码示例:
1. 首先,确保你已经安装了 Teigha.NET,并将其添加为项目的引用。
2. 在 XAML 文件中,添加一个 Image 控件用于显示图像:
```xaml
<Image x:Name="imageControl" />
```
3. 在代码文件中,使用以下代码加载和显示图像:
```csharp
using System;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;
using Teigha.GraphicsSystem;
using Teigha.Runtime;
namespace YourNamespace
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void LoadImage()
{
var rasterImage = new OdGiRasterImage();
// 你可以修改以下路径为你自己的图像路径
var imagePath = @"C:\path\to\your\image.jpg";
if (File.Exists(imagePath))
{
// 使用 Teigha.NET 加载图像文件
rasterImage.load(imagePath);
// 将图像转换为 WPF 的 BitmapSource
var bitmapSource = BitmapSource.Create(
rasterImage.pixelWidth(),
rasterImage.pixelHeight(),
96,
96,
ConvertPixelFormat(rasterImage.colorDepth()),
null,
rasterImage.scanLines(),
rasterImage.scanLinesStride());
// 在 Image 控件中显示图像
imageControl.Source = bitmapSource;
}
else
{
MessageBox.Show("指定的图像文件不存在!");
}
}
private PixelFormat ConvertPixelFormat(int colorDepth)
{
switch (colorDepth)
{
case 8:
return PixelFormats.Gray8;
case 24:
return PixelFormats.Bgr24;
case 32:
return PixelFormats.Bgra32;
default:
return PixelFormats.Default;
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
LoadImage();
}
}
}
```
这个示例演示了如何使用 Teigha.NET 加载图像文件,并将其显示在 WPF 中的 Image 控件中。你可以根据自己的需要进行修改和扩展。记得将代码中的 `YourNamespace` 替换为你自己的命名空间。
阅读全文