我正在考虑优化从 CGImage 获取像素数据的例程。目前这样做的方式(非常低效)是创建一个新的 CGContext,将 CGImage 绘制到上下文中,然后从上下文中获取数据。
我有以下优化的例程来处理这个问题:
CGImageRef imageRef = image.CGImage;
uint8_t *pixelData = NULL;
CGDataProviderRef imageDataProvider = CGImageGetDataProvider(imageRef);
CFDataRef imageData = CGDataProviderCopyData(imageDataProvider);
pixelData = (uint8_t *)malloc(CFDataGetLength(imageData));
CFDataGetBytes(imageData, CFRangeMake(0, CFDataGetLength(imageData)), pixelData);
CFRelease(imageData);
Run Code Online (Sandbox Code Playgroud)
这几乎有效。通过查看和比较两种方法得到的像素数据的hex dump,我发现在上面的例子中,每6360个字节就有8个字节是0。否则,数据是相同的。例如

这是与未优化版本的比较:

在 0 的 8 个字节之后,正确的像素数据继续。有谁知道为什么会这样?
更新:这是我正在优化的例程(剪下的代码只是获取大小信息和其他不重要的东西;相关位是返回的像素数据):
CGContextRef context = NULL;
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
// ... SNIP ...
context = CGBitmapContextCreate(...);
CGColorSpaceRelease(colorSpace);
// ... SNIP ...
CGContextDrawImage(context, rect, imageRef);
uint8_t *pixelData = (uint8_t *)CGBitmapContextGetData(context);
CGContextRelease(context); …Run Code Online (Sandbox Code Playgroud) 我有一个 web 视图,我想将它转换为应用程序另一部分的位图。
目前,我可以获得将在屏幕上呈现的 webview 部分的位图,但是我的位图需要包含页面的所有内容。
将 webview 的 layoutParams 设置为更大的尺寸会导致原始图像加载到更大的画布上。
这是我目前的实现:
FrameLayout.LayoutParams tempParams= new FrameLayout.LayoutParams(2000,4000);
_webView.setLayoutParams(tempParams);
_webView.layout(0,0,2000,4000);
int width = _webView.getWidth();
int height = _webView.getHeight();
_webView.postDelayed(new Runnable() {
@Override
public void run() {
Bitmap bitmap = Bitmap.createBitmap(_webView.getWidth(), _webView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
_webView.draw(canvas);
}
},100);
Run Code Online (Sandbox Code Playgroud)
我遵循了以下教程,它们似乎没有解决我的问题。
将 Android webview 渲染为位图、html5 javascript、回调问题
我正在考虑使用 PictureListener 和 capturePicture() 但这些已被弃用。
好的,我有一个带有图像的图片框,其 sizeMode 设置为:StretchImage,
现在,我想获取我单击的像素。(位图。GetPixel(x,y))。
但是当图像从正常尺寸拉伸时,我得到原始像素。就像在拉伸之前存在的像素一样(如果这有意义?)
我的代码:
Private void pictureBox1_MouseUp(object sender, MouseEventArgs e) {
Bitmap img = (Bitmap)pictureBox1.Image;
var color = img.GetPixel(e.X, e.Y)
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
在将背景图像设置为 Android 视图 (API 22) 的过程中,我遇到了一些问题。
我的图像是 1MB .jpeg 文件,4000x2672。
起初我尝试通过
android:background="@drawable/your_image"
Run Code Online (Sandbox Code Playgroud)
方法,获得D/skia?--- 由于缩放位图错误,分配失败。
然后我跟着http://developer.android.com/training/displaying-bitmaps/load-bitmap.html并实现如下:
位图解码器.java
(..omissis..)
public class BitmapDecoder {
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width …Run Code Online (Sandbox Code Playgroud) Activity1.class
public class CategoryActivity extends BaseActivity implements View.OnClickListener {
private RelativeLayout mReLayout;
private byte[] mImageByte;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_1);
addControl();
addEventOnClick();
mReLayout.setDrawingCacheEnabled(true);
}
private void addEventOnClick() {
findViewById(R.id.layout_category_1).setOnClickListener(this);
}
private void addControl() {
mReLayout = (RelativeLayout) findViewById(R.id.relative_category);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.layout_category_1:
startActivity();
break;
default:
break;
}
}
private void startActivity() {
Bitmap layoutBitmap = Bitmap.createBitmap(mReLayout.getWidth(), mReLayout.getHeight(), Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(layoutBitmap);
mReLayout.draw(canvas);
ByteArrayOutputStream bStream = new ByteArrayOutputStream(); …Run Code Online (Sandbox Code Playgroud) 有很多类似的问题,但似乎没有一个能回答我的问题。
我正在开发一个 UWP 应用程序(使用 Syncfusion),它可以生成一些 PDF。对于这个PDF,我需要得到一些Syncfusion.Pdf.Graphics.PdfBitmap,但在此之前,我需要稍微裁剪一下。
这就是我正在做的,我得到我的图表并将其转换为 PdfBitmap:
var diagramBitmap = new PdfBitmap(diagram);
Run Code Online (Sandbox Code Playgroud)
然后我需要通过以下方式将其绘制为 PDF:
document.Pages[0].Graphics.DrawImage(diagramBitmap, x, y, width, height);
Run Code Online (Sandbox Code Playgroud)
问题是,我发现的所有解决方案都不能在 UWP 中轻松地在绘制该 PdfBitmap 之前对其进行裁剪。我在没有裁剪图表的情况下解决了这个问题,它可以工作,但是裁剪它是更好更好的解决方案。
感谢您的帮助或建议!
我正在从智能卡读取数据。该数据还包含一张图片。在类 ReadData 中获取图片的代码:
public Bitmap GetPhotoFile()
{
byte[] photoFile = GetFile("photo_file");
Bitmap photo = new Bitmap(new MemoryStream(photoFile));
return photo;
}
Run Code Online (Sandbox Code Playgroud)
xaml 中的代码:
imgphoto = ReadData.GetPhotoFile();
Run Code Online (Sandbox Code Playgroud)
正在生成错误:
无法将类型“System.Drawing.Bitmap”隐式转换为“System.Windows.Controls.Image”
这方面的最佳方法是什么?
Bitmap tmp = new Bitmap(1000, 1000);
Graphics g = Graphics.FromImage(tmp);
Image img = Bitmap.FromFile(LoadPath);
Image img2 = Bitmap.FromFile(TempPath);
g.DrawImage(img, 0, 0);
g.DrawImage(img2, 250, 250);
Run Code Online (Sandbox Code Playgroud)
'img' 和 'img2' 是带有透明部分的图像。当我运行代码时,透明部分显示为黑色。这是为什么?
我有一个辅助方法,它使用自己的 using 语句创建位图。最初我有一个问题,当返回由 using 语句控制的对象时,它会在离开范围后被处理。所以,在这篇文章的帮助下,我能够弄清楚这也是我的问题。
所以我返回一个克隆版本并将它传递给 Graphics 类的 DrawImage 像这样,
g.DrawImage(getInputDataImage(dr.DRODAT, oFont, 430, 87, black, white, Color.Transparent), new Point(280, 23)); //DATE
Run Code Online (Sandbox Code Playgroud)
获取输入数据图像:
public static Image getInputDataImage(...
{
using(Bitmap bitmap = new Bitmap(width, height))
using (Graphics graphics = Graphics.FromImage(bitmap))
using(var format = new StringFormat{Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center})
{
//set coordinates on canvas to put barcode
Point point = new Point(50, 50);
RectangleF layoutRectangle = new RectangleF(new PointF(0, 0), new SizeF(bitmap.Width, bitmap.Height));
graphics.Clear(color);
graphics.DrawString(text, font, fontBrush, layoutRectangle, format); …Run Code Online (Sandbox Code Playgroud) 出于学习目的,我想使用没有外部库(例如 SDL)的 C 编程语言创建单个 2x2 位图图像。
我已经读到我需要为位图文件创建一个标头,但无法理解如何在代码中实现它以及为什么 bmp 标头具有这些参数。我找不到任何关于如何使用 C 做到这一点的明确教程。
您能否通过一个简单的文档示例为我提供有关如何实现这一点的指导?我正在使用 Linux。
bitmap ×10
c# ×4
android ×3
image ×3
.net ×1
background ×1
c ×1
cgimage ×1
drawable ×1
graphics ×1
ios ×1
java ×1
pdf ×1
picturebox ×1
syncfusion ×1
transparent ×1
uwp ×1
webview ×1
wpf ×1