我们有一个用 C++ 6 编写的应用程序,可以填充交通地图上的空白多边形以显示当前的交通状况。绿色表示良好,黄色表示拥挤,等等。
“壳图”是使用未填充任何内容的矩形和多边形的道路位图。从道路传感器(导线感应器环路)收集数据,并根据环路检测器数据填充多边形。
当地图发生变化时,必须有人在绘图中手动放大位图,并获取每个新形状内部周围的坐标,其中将填充拥塞颜色。构成地图骨架的多边形均以海军蓝色绘制,在白色背景上。
我做了一个应用程序。当用户单击多边形白色部分内的任意位置时,将向用户显示内部周界的点,并显示已绘制的内部许可者的放大缩略图。
在.Net 中,周界被完美地绘制。
在 C++ 6 应用程序中,一些多边形指向我的应用程序。收集无法正确显示。
我查看了 msPaint,发现 .Net 绘制点的方式与 MS Paint 不同。
这是一个简单的例子。代码来自一种表单,带有一个按钮和一个标签。在位图上绘制一条线,将位图“放大”以便您可以看到它,并显示在标签上。
如果您在 Paint 中使用相同的两个点绘制一条线,则绘制的线段与您在 MS Paint 中绘制的线段不同。
private void button1_Click(object sender, EventArgs e)
{
Bitmap bm = new Bitmap(16, 16);
Graphics g = Graphics.FromImage(bm);
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighSpeed;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Default;
Point pt = new Point(1, 3);
Point pt2 = new Point(5, 1);
// If you reverse the points, the same line …Run Code Online (Sandbox Code Playgroud) 正确的代码。给定
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId);
Drawable drawable = getResources().getDrawable(resId);
Run Code Online (Sandbox Code Playgroud)
我明白了
bitmap.getWidth() == drawable.getIntrinsicWidth() == 9
Run Code Online (Sandbox Code Playgroud)
尽管实际图像是6x6像素。关键是密度是240,因此比例1.5是DENSITY_DEFAULT = 160。这本身并不是一个问题,但bitmap.getPixel(x, y);也适用于放大的尺寸。
设置位图的密度似乎没有什么区别。我应该如何查询图像中真实位置的像素?我宁愿不将所有东西除以密度(通常甚至不可能)。
谢谢
我正在尝试从 Android 中的 URL 获取图像并将其设置为ImageView. 我正在做的事情如下:
image = new ImageView(mContext);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(MY_WIDTH, MY_HEIGHT);
params.leftMargin = lefMargin;
params.topMargin = topMargin;
image.setImageBitmap(BitmapFactory.decodeStream((InputStream)new URL(MY_URL).getContent());
relativeLayout.addView(image, params);
Run Code Online (Sandbox Code Playgroud)
但图像不适合我的尺寸(MY_WIDTH,MY_HEIGHT),它以自己的尺寸显示。该怎么办?
我有一个原始字节数组,我想从这些字节创建一个 bmp 文件。也就是说,我必须填充位图标头结构和其他内容,然后写下字节,以便我有一个正确格式的 bmp 文件。
由于我只需要进行一些快速检查,我想知道是否有一种可移植的方法可以做到这一点 - 获取原始字节并将它们保存为 bmp 文件。任何 Windows 版本都行不通,因为我是在 Unix 上写的。
或者,我可以将这些字节保存为任何其他图像格式 - 我只需要快速查看生成的图片。
在我的小部件中,我不断收到此错误:
11-02 09:35:10.613: D/D&D(1557): onCreate called
11-02 09:35:10.933: E/JavaBinder(1557): !!! FAILED BINDER TRANSACTION !!!
11-02 09:35:10.933: D/AppInfoAdapter(1557): top
Run Code Online (Sandbox Code Playgroud)
无论我做什么(我尝试减小位图大小,使位图静态,注释掉部分编码以查看错误所在(顺便说一句,这根本没有帮助)),我总是得到这个错误。这个错误导致的原因是它使我的用户安装的应用程序的列表视图根本不显示在滑动抽屉中(它只是空白)。我所有的链接和其他课程都工作得很好。(但我的 listView 是整个小部件的中心部分和主要功能。)
我现在不知所措,所以我只想发布三个可疑的课程,我已经得出结论,这是源于(因为所有其他课程都工作正常)。
请注意,一些代码被注释掉了(例如拖放功能的编码,因为我的真实设备不支持蜂窝。但是,当我的 listView 再次开始工作时,我将实现该代码)
AppInfoAdapter.java:
package com.example.awesomefilebuilderwidget;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
public class AppInfoAdapter extends BaseAdapter implements Filterable {
private Context …Run Code Online (Sandbox Code Playgroud) 具体来说:我需要将图片框实际显示的特定区域捕获为位图。该区域的坐标由我覆盖在图片框顶部的控件的边界指定(但该控件属于图片框)。当我制作该区域的“快照”时,该控件被隐藏。
我尝试使用普通的屏幕捕获方法(CopyFromScreen),但您无法真正控制那里的时间。所以它正在捕捉“间隙”状态,就像我的图片框中照片之间的过渡。通常,它仅捕获纯黑色图像(图片框的背景颜色)。
所以我尝试将显示的图像(picturebox.image 属性)转换为位图。问题在于图片框很少能准确显示图像。它显示图像的某些部分,根据其大小模式(即缩放)进行缩放和裁剪。因此,我不能只获取控制坐标并将它们从整个图像中剪切出来。
因此,我尝试估计正在显示图像的哪一部分,并据此纠正我的矩形。事实证明,我基本上是重新创建图片框的“缩放”代码来执行此操作(使用图片框的纵横比、图像的纵横比、猜测图像当前发生的缩放级别(如果图像较大)或小于图片框等)。这并不漂亮。
所以:现在我需要一种仅捕获当前在图片框的客户区域中显示的位图的方法,包括照片和当前在其周围显示的任何黑色“信箱”。有人有吗?
请记住,我不能依赖使用 CopyFromScreen。对于我的目的而言,它不够可靠。我想我需要一种获取图片框的方法来告诉我它正在显示的位。
我想主题已经说明了一切。但在一些细节上,我正在加载、操作、然后显示位图,并且是在 GDI 中完成的。现在我想增加一些速度,因为它反复发生。
许多年前,我将 DirectX 用于其他用途,但我所看到的一切都表明要摆脱 DirectX,转向 Direct2D。所以是时候扔掉所有这些知识并重新开始了。真正的 MS 方式;-)
好吧,为了操作位图,在进行渲染之前,我发现可以使用“Lock()”来获取它。界面上的功能也会告诉我尺寸。但我还需要了解 BBP,并跨步。
在有人说“你为什么不使用 ::GetBBP()... DUH”之前,经过数小时的 MSDN 和其他来源搜索后,我一直无法远程找到类似的东西。还有很多非常令人困惑的 COM 接口。
我唯一能找到的是 GetPixelFormat(),它返回一个 GUID,然后我编写大约 150 个“if (...)”语句来比较它。这样我就可以测试它的三个值,如果不是其中一个值则拒绝(1,8,32),这几乎不是处理这个问题的有效方法。
GetPixelFormat() 也不告诉我步幅。
有没有办法做到这一点?
(位图也是未压缩的,所以我什至不需要通过 IWICBitmapDecoder 运行它们,但我还没有弄清楚如何简单地告诉 IWICBitmap“这是一个 blob,将其用作大小为 xy 的位图”)
感谢您的任何帮助。
-斯科特
我想将像素从 BMP1 复制到 BMP2 但复制的图像是乱码。为什么?
注:输入图像为pf8bit;
TYPE
TPixArray = array[0..4095] of Byte;
PPixArray = ^TPixArray;
procedure Tfrm1.CopyImage;
VAR
BMP1, BMP2: TBitmap;
y, x: Integer;
LineI, LineO: PPixArray;
begin
BMP1:= TBitmap.Create;
BMP2:= TBitmap.Create;
TRY
BMP1.LoadFromFile('test.bmp');
BMP2.SetSize(BMP1.Width, BMP1.Height);
BMP2.PixelFormat:= BMP1.PixelFormat;
for y:= 0 to BMP1.Height -1 DO
begin
LineI := BMP1.ScanLine[y];
LineO := BMP2.ScanLine[y];
for x := 0 to BMP1.Width -1 DO
LineO[x]:= LineI[x];
end;
//BMP2.SaveToFile('out.bmp');
imgOut.Picture.Assign(BMP2); //TImage
FINALLY
FreeAndNil(BMP2);
FreeAndNil(BMP1);
END;
end;
Run Code Online (Sandbox Code Playgroud)
对于保存的图像,图形编辑器会显示“像素深度/颜色:索引,256 色板”。
下面是我的示例代码:
var lBitmap: TBitmap;
begin
lBitmap := TBitmap.Create;
lBitmap.PixelFormat := TPixelFormat.pf32bit;
lBitmap.Transparent := TRUE; // !
lBitmap.LoadFromFile( 'd:\temp\bmp32b_300dpi_transparent_400x250.bmp' );
// Bitmap RGB+Alpha created with GIMP
// modifications on pixels
Canvas.Draw(100, 0, lBitmap);
// Up to this point it is correct, the drawing is painted with transparency
lBitmap.SaveToFile( 'd:\tmp\after.bmp' ); // after this -> I have lost transparency
lBitmap.Free;
end;
Run Code Online (Sandbox Code Playgroud)
如何正确使用 TBitmap 对象来保存具有透明度的文件?
我在旧版本中使用 getBitmap 方法,但我无法从 Uri 中找到 getBitmap 的任何替代方法。
try {
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, imageUri);
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
现在我从 android 指南中找到了另一种方法,但这仍然不起作用。我不知道如何在工作线程中执行此方法。Guide 说这个方法应该在工作线程中运行。任何人都可以帮助我如何做到这一点?
try {
bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(contentResolver, imageUri));
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的类来从 imageUri 获取位图。这里是。
public class BitmapResolver {
@SuppressWarnings("deprecation")
private static Bitmap getBitmapLegacy(@NonNull ContentResolver contentResolver, @NonNull Uri fileUri){
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, fileUri);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
@TargetApi(Build.VERSION_CODES.P)
private static Bitmap getBitmapImageDecoder(@NonNull ContentResolver …Run Code Online (Sandbox Code Playgroud) bitmap ×10
android ×4
c# ×2
delphi ×2
image ×2
bitmapdata ×1
c++ ×1
direct2d ×1
directdraw ×1
image-size ×1
java ×1
picturebox ×1
tbitmap ×1
unix ×1
url ×1
vcl ×1
winforms ×1