DPI(dots per inch) PPI(pixel per inch) 求一张图片在某分辨率下的实际尺寸?求计算机显示器PPI? MFC按600dpi时的实际物理尺寸打印图片

news/2024/11/24 17:05:22/

标准固定

1 寸=3.3333333 厘米
1 英寸=2.54 厘米

求计算机显示器PPI?

比如对角线14英寸,不是寸,即2.54*14=35.56cm
按16:9算出宽和高 高(9x)2+宽(16x)2=对角线35.56cm2   算出宽*高:30.99*17.43cm  即30.99/2.54英寸
像素为1920*1080  PPI=1920*2.54/30.99= 约157PPI(pixel per inch)

求一张图片在某分辨率下的实际尺寸?

比如600PPI(pixel per inch 显示器)或DPI(dots per inch 打印机) ,像素为1920*1080,算宽*高各为多少英寸或厘米?

像素为1920*1080,打印机为600dpi
宽=1920/600 英寸=1920/600*2.54 厘米=8.128 厘米
高=1080/600 英寸=1080/600*2.54 厘米=4.572 厘米

现在改为打印机300dpi,要求实际物理尺寸不变。
宽=width/300 英寸=width/300*2.54 厘米=8.128 厘米
高=height/300 英寸=height/300*2.54 厘米=4.572 厘米
必须缩放图片像素为960*540

所以,不同点数的打印机要按实际物理尺寸打印图片,那必须缩放图片,即改变像素。实际尺寸以打印机为600dpi为标准:currnet_x_pix=old_x_pix/600*currnet_dpi

C#按物理尺寸打印图片 e.Graphics.DrawImage(image,0,0); //按物理尺寸打印标签,600点改为300点的打印机_小黄人软件的博客-CSDN博客

MFC按实际物理尺寸打印图片

方法1.获得打印机点数,按点数转换图片像素


#include "pch.h"
#include "../pch.h"
#include "../utility/utility.h"
#include <atlbase.h> using namespace Gdiplus;
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{UINT  num = 0;          // number of image encodersUINT  size = 0;         // size of the image encoder array in bytesImageCodecInfo* pImageCodecInfo = NULL;GetImageEncodersSize(&num, &size);if (size == 0)return -1;  // FailurepImageCodecInfo = (ImageCodecInfo*)(malloc(size));if (pImageCodecInfo == NULL)return -1;  // FailureGetImageEncoders(num, size, pImageCodecInfo);for (UINT j = 0; j < num; ++j){if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0){*pClsid = pImageCodecInfo[j].Clsid;free(pImageCodecInfo);return j;  // Success}}free(pImageCodecInfo);return -1;  // Failure
}
BOOL getBMPInfo(LPCTSTR  fileName)
{// Initialize GDI+.GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);USES_CONVERSION;Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(T2W(fileName));if (pBitmap == NULL || pBitmap->GetLastStatus() != Gdiplus::Ok) { logger.ERROR_F(__FUNCTION__+to_string(__LINE__)+"出错:" + to_string(pBitmap->GetLastStatus()));  delete pBitmap;	return FALSE; }logger.INFO_F("水平*垂直分辨率:" +to_string(pBitmap->GetHorizontalResolution()) + "*" + to_string(pBitmap->GetVerticalResolution()));logger.INFO_F("width*height像素:" + to_string(pBitmap->GetWidth())+"*"+ to_string(pBitmap->GetHeight()));logger.INFO_F("600dpi时width*height厘米:" + to_string((float)(pBitmap->GetWidth())*2.54 /600) + "*" + to_string((float)(pBitmap->GetHeight())*2.54 /600));//if (abs(pBitmap->GetHorizontalResolution() - dpi)>0.5 || abs(pBitmap->GetVerticalResolution() - dpi)> 0.5)//{//	logger.ERROR_F("水平分辨率" + to_string(pBitmap->GetHorizontalResolution()) + "或垂直分辨率" + to_string(pBitmap->GetVerticalResolution()) + " 错误,应该为" + to_string(dpi));//	delete pBitmap;//	return FALSE;//}delete pBitmap;return TRUE;
}
BOOL setBMPResolution(LPCTSTR  fileName, float dpi)
{LPCTSTR outFileName = "temp.bmp";// Initialize GDI+.GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);USES_CONVERSION;Gdiplus::Bitmap* pBitmap = new Gdiplus::Bitmap(T2W(fileName));if (pBitmap==NULL || pBitmap->GetLastStatus() != Gdiplus::Ok) { logger.ERROR_F("转分辨率出错:" + to_string(pBitmap->GetLastStatus()));  delete pBitmap;	return FALSE; }Gdiplus::Status status = pBitmap->SetResolution(dpi, dpi);//设置此 Bitmap 的分辨率。if (status != Gdiplus::Ok) { logger.ERROR_F("转分辨率:" + to_string(status));  delete pBitmap;	return FALSE; }CLSID clsid;GetEncoderClsid(L"image/bmp", &clsid);				//Get the encoderstatus = pBitmap->Save(T2W(outFileName), &clsid);//Save the image into physical memoryif (status != Gdiplus::Ok) { logger.ERROR_F("转分辨率后,保存错误:" + to_string(status)); delete pBitmap;	return FALSE; }delete pBitmap;pipe_system("del "+ (CString)fileName+"\n", DELAY); //cmd先删除pipe_system("rename " + (CString)outFileName + " "+ fileName +"\n", DELAY); //cmd重命名为原来的名logger.INFO_F(string(fileName)+"设置分辨率成功:" + to_string(dpi));return TRUE;
}void PrintBitmap(LPCTSTR filename)
{//setBMPResolution(filename, 600);//转为600分辨率getBMPInfo(filename);CPrintDialog printDlg(FALSE);printDlg.GetDefaults(); CDC dc;if (!dc.Attach(printDlg.GetPrinterDC())) {AfxMessageBox(_T("No printer found!")); return;} dc.m_bPrinting = TRUE; DOCINFO di;    // Initialise print document details::ZeroMemory (&di, sizeof (DOCINFO));di.cbSize = sizeof (DOCINFO);di.lpszDocName = filename; //显示在打印列表里的名字BOOL bPrintingOK = dc.StartDoc(&di); // Begin a new print job // Get the printing extents// and store in the m_rectDraw field of a // CPrintInfo objectCPrintInfo Info;Info.SetMaxPage(1); // just one page //打印机页面的水平和垂直像素int maxw = dc.GetDeviceCaps(HORZRES);int maxh = dc.GetDeviceCaps(VERTRES); //打印机每英寸像素数int cxInch = dc.GetDeviceCaps(LOGPIXELSX);int cyInch = dc.GetDeviceCaps(LOGPIXELSY);logger.INFO_F("页面:" + to_string(maxw)+"*"+to_string(maxh) + " 打印机DPI:" + to_string(cxInch)+"*"+to_string(cyInch)); //mm 纸尺寸  Info.m_rectDraw.SetRect(0, 0, maxw, maxh);for (UINT page = Info.GetMinPage(); page <= Info.GetMaxPage() && bPrintingOK; page++) {dc.StartPage();    // begin new pageInfo.m_nCurPage = page;CBitmap bitmap;// LoadImage does the trick here, it creates a DIB section// You can also use a resource here// by using MAKEINTRESOURCE() ... etc. if(!bitmap.Attach(::LoadImage(::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE))) {AfxMessageBox(_T("Error loading bitmap!")); return;} BITMAP bm;bitmap.GetBitmap(&bm);//获得宽与高// create memory device contextCDC memDC; memDC.CreateCompatibleDC(&dc);CBitmap *pBmp = memDC.SelectObject(&bitmap);memDC.SetMapMode(dc.GetMapMode());dc.StretchBlt(0, 0, bm.bmWidth * cxInch / 600 , bm.bmHeight * cyInch / 600 , &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);//按600dpi时的实际尺寸打印//dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY); //按图片大小打印// clean upmemDC.SelectObject(pBmp);bPrintingOK = (dc.EndPage() > 0);   // end page} if (bPrintingOK)dc.EndDoc(); // end a print jobelse dc.AbortDoc();           // abort job. 
}


http://www.ppmy.cn/news/721170.html

相关文章

PPT导出为高分辨率图片

把PPT中的某一页幻灯片导出为图片时&#xff0c;默认分辨率非常低&#xff0c;导出的图片非常模糊&#xff0c;可通过改变注册表提高图片分辨率。 此方案为微软官方给出的解决方案。 1.winr 打开命令窗口&#xff0c;输入regedit打开注册表 2.按照以下路径进入Options&#x…

请基于matlab将pdf格式的图片批处理转换为600dpi的tif格式文件,并裁剪为5736*2607的尺寸保存为600dpi的tif文件...

以下是在MATLAB中进行批处理转换和裁剪的基本步骤&#xff1a; 设置文件路径和输出路径。使用 dir 函数读取文件夹中的所有 PDF 文件。使用 imread 函数读取 PDF 文件。使用 imresize 函数将图像的分辨率调整为 600 dpi。使用 imcrop 函数裁剪图像到 5736x2607 像素。将处理后的…

Matlab导出高DPI图像——生成高分辨率.eps .tiff .jpg图像的方法

论文中常常要求高dpi的图像导出&#xff0c;matlab fig中的export设置可以帮助我们实现这样的目标。 1.使用file>export setup 随后点击文件》导出设置》就能打开导出设置窗口&#xff1a; 我们需要设置: 大小的单位&#xff08;有时候需要自行设置宽和高&#xff09;&…

Visio录制宏代码——重复批量导出600dpi的tiff图片

Visio录制宏&#xff0c;重复批量导出600dpi的tiff图片 因为论文修改需要&#xff0c;需要对 3 3 4 36 3\times3\times436 33436张图片反复修改调整&#xff0c;然后将图片依次导出为600dpi的tiff图片。很不幸的是&#xff0c;枯燥的导出动作做了五六遍&#xff0c;郁闷时想…

PPT画图如何保存600dpi以及消除白边问题

摘要&#xff1a;写论文时候&#xff0c;有时候需要在PPT画图&#xff0c;完事了&#xff0c;另存为图片总是遇到图片模糊以及有白边的问题。本文通过修改PPT图像设置&#xff0c;修改注册表&#xff0c;调整PPT幻灯片大小&#xff0c;提供解决办法。 文章目录 前言一、修改PPT…

2.java基础(二)

int和Integer有什么区别&#xff0c;二者在做运算时会得到什么结果&#xff1f; int是基本数据类型&#xff0c;而integer是他的包装类。两者在做运算时Integer会自动拆箱为int类型&#xff0c;从而比较int值是否相等&#xff0c;不相等返回false&#xff0c;相等返回ture 说…

通过一个实际例子说明Django中的数据库操作方法法ForeignKey()的用法【数据表“一对多”关系】

当使用Django进行数据库操作时&#xff0c;ForeignKey&#xff08;外键&#xff09;是一种非常有用的字段类型。它允许在数据库表之间创建关联关系&#xff0c;类似于其他数据库系统中的外键概念。通过ForeignKey字段&#xff0c;我们可以建立一个模型与另一个模型的一对多关系…

全排列(递归算法)

一&#xff0e; 全排列算法 首先&#xff1a;什么是全排列》百度一下 从n个不同元素中任取m&#xff08;m≤n&#xff09;个元素&#xff0c;按照一定的顺序排列起来&#xff0c;叫做从n个不同元素中取出m个元素的一个排列。当mn时所有的排列…